Silverlight 未调用绑定属性设置程序
我对以下场景有一个问题(为了简洁起见,代码被剪切)。基本上,当设置依赖项属性时,不会调用用户控件属性的Setter,我需要解决这个问题 我的View.xaml中有以下代码Silverlight 未调用绑定属性设置程序,silverlight,Silverlight,我对以下场景有一个问题(为了简洁起见,代码被剪切)。基本上,当设置依赖项属性时,不会调用用户控件属性的Setter,我需要解决这个问题 我的View.xaml中有以下代码 <Filter:Filter x:Name="ProductFilter" PrimaryItemSource="{Binding CarrierProducts}" /> 在我的ViewModel中,我公开了一个属性 public ObservableCollection<Model.Filte
<Filter:Filter x:Name="ProductFilter" PrimaryItemSource="{Binding CarrierProducts}" />
在我的ViewModel中,我公开了一个属性
public ObservableCollection<Model.FilterItem> _carrierProducts;
public ObservableCollection<Model.FilterItem> CarrierProducts
{
get
{
return _carrierProducts;
}
set
{
if (_carrierProducts != value)
{
_carrierProducts = value;
RaisePropertyChanged("CarrierProducts");
}
}
}
public observeCollection\u carrier产品;
公共可观测收集载体产品
{
得到
{
返回载体产品;
}
设置
{
if(_carrierProducts!=值)
{
_carrierProducts=价值;
RaisePropertyChanged(“CarrierProducts”);
}
}
}
最后,过滤器用户控件的定义如下
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);
}
}
公共静态只读从属属性PrimaryItemSourceProperty=
DependencyProperty.Register(“PrimaryItemSource”、typeof(ObservableCollection)、typeof(Filter)、new PropertyMetadata(null));
公共可观测集合主项源
{
得到
{
返回(ObservableCollection)GetValue(PrimaryItemSourceProperty);
}
设置
{
SetValue(PrimaryItemSourceProperty,值);
ComboBox combo=_filters.ElementAt(0);
FilterSourceChange(组合,值);
}
}
由于某些原因,设置了PrimaryItemSource属性,但没有调用Setter。我是否必须向PropertyMetadata对象添加PropertyChange事件来处理此问题,因为对于一些简单的事情来说,这似乎需要很多代码。是的,如果您需要setter的其他逻辑,请始终使用回调。这在Silverlight和WPF中是必须的 据我所知,Setter只有在从代码实际使用时才会被调用。进行绑定时,使用DependencyProperty框架会发生一些事情
您还应该将
组合框combo=…
代码包装成this.Dispatcher.BeginInvoke(()=>…)代码>,因为这确保了可视化树被初始化。dependencProperty.Register()方法的最后一个参数接受传递null的PropertyMetaData。构造函数的一个重载接受PropertyChangedCallback。使用此重载可定义在修改属性时将调用的回调函数
static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Filter filter = d as Filter;
ComboBox combo = filter._filters.ElementAt(0);
filter.FilterSourceChange(combo, filter.PrimaryItemSource);
}
这就是需要在集合上运行其他代码的依赖项属性的编写方式:-
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);
}
公共ObservableCollection PrimaryItemSource
{
get{return(ObservableCollection)GetValue(PrimaryItemSourceProperty);}
set{SetValue(PrimaryItemSourceProperty,value);}
}
公共静态只读从属属性PrimaryItemSourceProperty=
从属属性。寄存器(
“PrimaryItemSource”,
类型(可观测采集),
typeof(Filter),新属性元数据(null,OnPrimaryItemSourceChanged));
PrimaryItemSourceChanged上的私有静态无效(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
过滤器过滤器=(过滤器)d;
var oldValue=(ObservableCollection)e.oldValue;
var newValue=(ObservableCollection)e.newValue;
filter.OnPrimaryItemSourceChanged(旧值、新值);
}
PrimaryItemSource上受保护的虚拟无效已更改(
可观察收集值,
可观测收集(新值)
{
ComboBox combo=_filters.ElementAt(0);
FilterSourceChange(组合,newValue);
}
您可以使用在类中放置一个静态DependencyPropertyChanged处理程序,该处理程序将依赖项对象强制转换为正确的类型,然后调用实例方法来提醒该实例该更改
每当底层依赖项属性发生更改时,都会调用此更改处理程序,即通过属性Set
方法中的SetValue
调用,或通过绑定或任何其他方式进行更改。我意识到我可以将PropertyChangedCallback添加到元数据中,但我想知道这是否正常?
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);
}