Когда будет метод Преобразования ValueConverter быть названным в wpf

Мне связали ObservableCollection с полем списка и булево свойством, связанным с кнопкой. Я затем определил два преобразователя, тот, который воздействует на набор и другой, воздействует на булево свойство. Каждый раз, когда я изменяю булево свойство, метод Преобразования преобразователя называют, где, поскольку то же не называют, если я изменяю заметный набор. Что я пропускаю??

Отрывки для Вашей ссылки,

отрывок xaml,

<Window.Resources>
    <local:WrapPanelWidthConverter x:Key="WrapPanelWidthConverter" />
    <local:StateToColorConverter x:Key="StateToColorConverter" />
</Window.Resources>
<StackPanel>
    <ListBox x:Name="NamesListBox" ItemsSource="{Binding Path=Names}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel x:Name="ItemWrapPanel" Width="500" Background="Gray">
                    <WrapPanel.RenderTransform>
                        <TranslateTransform x:Name="WrapPanelTranslatation" X="0" />
                    </WrapPanel.RenderTransform>
                    <WrapPanel.Triggers>
                        <EventTrigger RoutedEvent="WrapPanel.Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="WrapPanelTranslatation" Storyboard.TargetProperty="X" To="{Binding Path=Names,Converter={StaticResource WrapPanelWidthConverter}}" From="525"  Duration="0:0:2" RepeatBehavior="100" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </WrapPanel.Triggers>
                </WrapPanel>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Label Content="{Binding}" Width="50" Background="LightGray" />
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Content="{Binding Path=State}" Background="{Binding Path=State, Converter={StaticResource StateToColorConverter}}" Width="100" Height="100" Click="Button_Click" />
</StackPanel>   

код позади отрывка

public class WrapPanelWidthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        ObservableCollection<string> aNames = value as ObservableCollection<string>;
        return -(aNames.Count * 50);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}


public class StateToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool aState = (bool)value;
        if (aState)
            return Brushes.Green;
        else
            return Brushes.Red;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}   
5
задан sudarsanyes 12 May 2010 в 04:57
поделиться

2 ответа

Я думаю, что преобразователь в Binding всегда вызывается, если Binding был обновлен и уведомляет об этом обновлении (как DependencyProperty или с помощью INotifyPropertyChanged ). Однако ObservableCollection не вызывает событие PropertyChanged , если элемент был добавлен или удален, но вызывает событие CollectionChanged . Он вообще не вызывает никаких событий, если элемент в коллекции изменяется. Даже если сам элемент вызывает PropertyChanged , это не обновит привязку в коллекции, поскольку источник Binding - это не элемент, а коллекция.

Боюсь, что ваш подход не сработает. Вы можете напрямую привязаться к ObservableCollection.Count и добавить к нему соответствующий математический преобразователь для выполнения инверсии и умножения, но свойство Count не выполняет уведомление об изменении, поэтому это не вариант.Я думаю, вам придется предоставить другое свойство в вашей ViewModel или коде программной части, которое обрабатывает эти случаи ...

12
ответ дан 18 December 2019 в 05:43
поделиться

Конвертер вызывается, когда происходит привязка или изменяется свойство. Таким образом, ваш преобразователь вызывается для вашего логического значения всякий раз, когда значение логического изменяется. Ваша коллекция устанавливается один раз, и именно тогда происходит привязка и используется конвертер. Когда внутренняя часть коллекции изменяется (коллекция добавляется или удаляется), свойство не изменяется (т. Е. Вы не привязываете новую коллекцию), поэтому ваш конвертер больше не запускается.

Используйте модель представления, оберните вашу коллекцию и добавьте еще одно свойство, такое как count, которое реализует уведомление об изменении. Вы можете использовать этот класс-оболочку из здесь , который обернет вашу коллекцию, и там будет легко добавить свойство.

2
ответ дан 18 December 2019 в 05:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: