Tôi có một ObservableCollection ràng buộc vào một hộp danh sách và boolean sở hữu ràng buộc vào một nút . Sau đó tôi đã xác định hai bộ chuyển đổi, bộ chuyển đổi hoạt động trên bộ sưu tập và bộ kia hoạt động trên thuộc tính boolean. Bất cứ khi nào tôi sửa đổi thuộc tính boolean, phương thức Chuyển đổi của trình biến đổi được gọi, trong đó giống như không được gọi nếu tôi sửa đổi tập hợp quan sát được. Tôi đang thiếu gì ??Khi phương pháp Chuyển đổi của ValueConverter sẽ được gọi trong WPF
Snippets để bạn tham khảo,
XAML snipet,
<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>
mã sau đoạn mã
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();
}
}
Bất cứ khi nào một mục được bổ sung vào bộ sưu tập, các thành viên ObservableCollection là nâng CollectionModified biến cố. Trong trường hợp Trình chuyển đổi chỉ được kích hoạt khi Thuộc tính được sửa đổi. Để giải quyết sự cố này, người dùng có thể đăng ký sự kiện đã sửa đổi bộ sưu tập và sau đó tăng sự kiện PropertyChanged bằng tên thuộc tính của ObservableCollection. – sudarsanyes
Vừa mới xem qua câu trả lời của bạn và tôi cũng phỏng đoán như vậy. – sudarsanyes
Cách giải quyết của bạn có thể hoạt động, nhưng bạn nên lưu ý rằng cách giải quyết này sẽ cập nhật ràng buộc hoàn chỉnh, tức là bộ sưu tập được đọc lại và tất cả các mục trong bộ sưu tập của bạn được tạo lại một lần nữa. Ít nhất, đó là những gì tôi mong đợi. Tôi muốn khuyên bạn nên ràng buộc với một thuộc tính 'Count' tùy chỉnh, nhưng nó phụ thuộc vào kịch bản của bạn cho dù đó là giá trị trên đầu. – gehho