我的 WPF应用程序中显示了两个集合,我希望其中一个元素在另一个中禁用.这样做我正在创建一个继承ListBox的自定义控件FilteringListBox,我想在其中添加一些处理来禁用通过FilteringListBox上的
我创建了一个简化的应用程序,我重现了这个问题.这是我的Xaml:
<StackPanel> <StackPanel Orientation="Horizontal"> <StackPanel Orientation="Vertical"> <TextBlock>Included</TextBlock> <ListBox x:Name="IncludedFooList" ItemsSource="{Binding IncludedFoos}"></ListBox> </StackPanel> <Button Margin="10" Click="Button_Click">Add selected</Button> <StackPanel Orientation="Vertical"> <TextBlock>Available</TextBlock> <Listbox:FilteringListBox x:Name="AvailableFooList" ItemsSource="{Binding AvailableFoos}" FilteringCollection="{Binding IncludedFoos}"></Listbox:FilteringListBox> </StackPanel> </StackPanel> </StackPanel>
这是我的自定义组件 – 目前只持有Dependency属性:
public class FilteringListBox : ListBox { public static readonly DependencyProperty FilteringCollectionProperty = DependencyProperty.Register("FilteringCollection", typeof(ObservableCollection<Foo>), typeof(FilteringListBox)); public ObservableCollection<Foo> FilteringCollection { get { return (ObservableCollection<Foo>)GetValue(FilteringCollectionProperty); } set { SetValue(FilteringCollectionProperty, value); } } }
对于完整的代码,后面的代码和类定义在这里:
public partial class MainWindow : Window { private MainViewModel _vm; public MainWindow() { InitializeComponent(); _vm = new MainViewModel(); DataContext = _vm; } private void Button_Click(object sender, RoutedEventArgs e) { if (AvailableFooList.SelectedItem == null) return; var selectedFoo = AvailableFooList.SelectedItem as Foo; _vm.IncludedFoos.Add(selectedFoo); } } public class MainViewModel { public MainViewModel() { IncludedFoos = new ObservableCollection<Foo>(); AvailableFoos = new ObservableCollection<Foo>(); GenerateAvailableFoos(); } private void GenerateAvailableFoos() { AvailableFoos.Add(new Foo { Text = "Number1" }); AvailableFoos.Add(new Foo { Text = "Number2" }); AvailableFoos.Add(new Foo { Text = "Number3" }); AvailableFoos.Add(new Foo { Text = "Number4" }); } public ObservableCollection<Foo> IncludedFoos { get; set; } public ObservableCollection<Foo> AvailableFoos { get; set; } } public class Foo { public string Text { get; set; } public override string ToString() { return Text; } }
我将断点添加到FilteringListBox中的DependencyProperty FilteringCollection的setter和getter,但它永远不会被触发.为什么?我该如何解决?
绑定系统绕过set并获取依赖项属性的访问器.如果要在依赖项属性更改时执行代码,则应将PropertyChangedCallback添加到DependencyProperty定义中.