我有以下方案的问题(代码简洁).基本上,当设置依赖项属性时,我的用户控件属性的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事件来处理这个事件,因为这看起来像很多简单的代码.
这就是应该如何编写需要在集合上运行其他代码的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
方法中的调用或通过绑定或任何其他方式更改基础依赖项属性,就会调用此更改处理程序.
归档时间: |
|
查看次数: |
1180 次 |
最近记录: |