Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 未调用绑定属性设置程序_Silverlight - Fatal编程技术网

Silverlight 未调用绑定属性设置程序

Silverlight 未调用绑定属性设置程序,silverlight,Silverlight,我对以下场景有一个问题(为了简洁起见,代码被剪切)。基本上,当设置依赖项属性时,不会调用用户控件属性的Setter,我需要解决这个问题 我的View.xaml中有以下代码 <Filter:Filter x:Name="ProductFilter" PrimaryItemSource="{Binding CarrierProducts}" /> 在我的ViewModel中,我公开了一个属性 public ObservableCollection<Model.Filte

我对以下场景有一个问题(为了简洁起见,代码被剪切)。基本上,当设置依赖项属性时,不会调用用户控件属性的Setter,我需要解决这个问题

我的View.xaml中有以下代码

<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); 
 }