绑定属性设置器未被调用

Jam*_*hes 4 silverlight

我有以下方案的问题(代码简洁).基本上,当设置依赖项属性时,我的用户控件属性的Setter没有被调用,我需要解决这个问题.

我在View.xaml中有以下代码

<Filter:Filter x:Name="ProductFilter" PrimaryItemSource="{Binding CarrierProducts}"  />
Run Code Online (Sandbox Code Playgroud)

在View.xaml.cs中

    public ProductPricing()
    {
        InitializeComponent();

        ViewModel.Filter.ProductPricing vm = new ViewModel.Filter.ProductPricing();
        this.DataContext = vm;
    }
Run Code Online (Sandbox Code Playgroud)

在我的ViewModel中,我公开了一个属性

    public ObservableCollection<Model.FilterItem> _carrierProducts;
    public ObservableCollection<Model.FilterItem> CarrierProducts
    {
        get
        {
            return _carrierProducts;
        }
        set
        {
            if (_carrierProducts != value)
            {
                _carrierProducts = value;
                RaisePropertyChanged("CarrierProducts");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

最后,过滤器用户控件的定义如下.

   public static readonly DependencyProperty PrimaryItemSourceProperty =
        DependencyProperty.Register("PrimaryItemSource", typeof(ObservableCollection<Model.FilterItem>), typeof(Filter), new PropertyMetadata(null));

    public ObservableCollection<Model.FilterItem> PrimaryItemSource
    {
        get
        {
            return (ObservableCollection<Model.FilterItem>)GetValue(PrimaryItemSourceProperty);
        }

        set
        {
            SetValue(PrimaryItemSourceProperty, value);

            ComboBox combo = _filters.ElementAt(0);
            FilterSourceChange(combo, value);
        }
    }
Run Code Online (Sandbox Code Playgroud)

由于某种原因,设置了PrimaryItemSource属性,但未调用Setter.我是否必须向PropertyMetadata对象添加一个PropertyChange事件来处理这个事件,因为这看起来像很多简单的代码.

Ant*_*nes 5

这就是应该如何编写需要在集合上运行其他代码的Dependency属性: -

 public ObservableCollection<Model.FilterItem> PrimaryItemSource
 {
     get { return (ObservableCollection<Model.FilterItem>)GetValue(PrimaryItemSourceProperty); }
     set { SetValue(PrimaryItemSourceProperty , value); }
 }

 public static readonly DependencyProperty PrimaryItemSourceProperty =  
    DependencyProperty.Register(
    "PrimaryItemSource",
    typeof(ObservableCollection<Model.FilterItem>),
    typeof(Filter), new PropertyMetadata(null, OnPrimaryItemSourceChanged));  


 private static void OnPrimaryItemSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
 {
      Filter filter = (Filter)d;
      var oldValue = (ObservableCollection<Model.FilterItem>)e.OldValue;
      var newValue = (ObservableCollection<Model.FilterItem>)e.NewValue;
      filter.OnPrimaryItemSourceChanged(oldValue, newValue);
 }

 protected virtual void OnPrimaryItemSourceChanged(
     ObservableCollection<Model.FilterItem> oldValue,
     ObservableCollection<Model.FilterItem> newValue)
 {
     ComboBox combo = _filters.ElementAt(0);        
     FilterSourceChange(combo, newValue); 
 }
Run Code Online (Sandbox Code Playgroud)

您可以在类中放置一个静态DependencyPropertyChanged处理程序,它将依赖项对象转换为正确的类型,然后调用实例方法来警告该更改的实例.

只要通过SetValue属性Set方法中的调用或通过绑定或任何其他方式更改基础依赖项属性,就会调用此更改处理程序.