.net – 为什么绑定到它时我的依赖属性设置不是?

我的 WPF应用程序中显示了两个集合,我希望其中一个元素在另一个中禁用.这样做我正在创建一个继承ListBox自定义控件FilteringListBox,我想在其中添加一些处理来禁用通过FilteringListBox上的属性在集合集中设置的元素.现在,我的问题是没有设置我想要过滤元素的ObservableCollection的依赖属性 – 即使我在xaml中绑定它.

我创建了一个简化的应用程序,我重现了这个问题.这是我的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定义中.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...