silverlight 3集合绑定

时间:2009-11-09 15:39:01

标签: silverlight binding collections

有人请帮助我理解为什么这种绑定不起作用......

我有一个名为SelectionManager的类,其中包含一个名为'dates'的属性,该属性由WCF服务填充。该属性是一个结构数组,它捆绑了DateTime和业务对象的整数。

public class SelectionManager : INotifyPropertyChanged {

    ... other properties ...

    public DQMServiceDateCountPair[] dates { get; private set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName) {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
    }

我有另一个名为DateSelector的类,它有一个名为'pairs'的DependencyProperty设置为'dates'的绑定目标。

public partial class DateSelector : UserControl {

... other stuff ...

public static readonly DependencyProperty pairsProperty = DependencyProperty.Register(
    "pairs",
    typeof(DQMServiceDateCountPair[]),
    typeof(DateSelector),
    new PropertyMetadata(new DQMServiceDateCountPair[0])
);

public DQMServiceDateCountPair[] pairs {
    get { return (DQMServiceDateCountPair[])GetValue(pairsProperty); }
    set { 
        Debug.WriteLine("adding dates");
        SetValue(pairsProperty, value);
        dateMode = DateMode.Years;
    }
}

}

在我的MainPage.xaml中,我有这样的一行:

<date:DateSelector x:Name="dateSelector" pairs="{Binding dates}" />

这很奇怪,因为MainPage.xaml中的所有其他绑定都正确更新,包括绑定到'dates'的ComboBox。但是,我的UserControl不会更新。 Debug.Writeline不会在'pairs'属性的set语句中调用。

在玩它时,我尝试将DQMServiceDateCountPair []属性设置为ObservableCollection并实现INotifyCollectionChanged,但这没有帮助。

如果我将source属性或target属性保留为数组,并使另一个成为ObservableCollection,那么我会收到一个绑定错误,指出它无法自动将一个转换为另一个,因此Silverlight似乎意识到了绑定,它只是不更新​​它。

有人可以帮忙吗?

P.S。我正在使用Silverlight 3。

3 个答案:

答案 0 :(得分:0)

尝试更改代码,如下所示:
1.添加DataMember / DataContract属性
2.将“设置”公开

[DataContract]
public class SelectionManager : INotifyPropertyChanged {

    [DataMember]
    public DQMServiceDateCountPair[] dates { get; set; }

    public event PropertyChangedEventHandler PropertyChanged;

    public void NotifyPropertyChanged(string propertyName) {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
    }

答案 1 :(得分:0)

当你按照自己的方式对自己的课程进行编码时,其他的东西真的很奇怪。我的猜测是dates数组由一些在WCF请求完成时在选择管理器内部运行的代码设置。

Howerver虽然您实现了INotifyPropertyChanged,但实际上并没有提升它定义的事件。您无法真正将INotifyPropertyChanged与Auto-property C#语法结合使用。你需要这个: -

public SelectionManager : INotifyPropertyChanged
{
   private DQMServiceDateCountPair[] myDates;
   public DQMServiceDateCountPair[] dates
   {
     get { return myDates; }
     set
     {
       myDates = value;
       NotifyPropertyChanged("dates");
     }
     // rest of your code
}

答案 2 :(得分:0)

所以,这就是发生了什么。绑定一直都很好。在过去的一周里,我一直在努力解决这个问题,它一直在愉快地进行更新 - 但由于我的错误假设,我永远无法看到它。

如果其他人怀有这个错误的假设,让我拼出来:

由于您要声明依赖属性,因此不会自动进行GetValue和SetValue调用。声明的“new PropertyMetadata()”部分有一个带有回调方法的重载。在此回调方法中,您必须自己设置属性值。例如,在我的代码中,我将其作为PropertyMetadata调用:

new PropertyMetadata(new PropertyChangedCallback(OnPairsPropertyChanged))

并且回调方法如下所示:

private static void OnPairsPropertyChanged( DependencyObject d, DependencyPropertyChangedEventArgs e ) {
    ((DateSelector)d).pairs = (DQMServiceDateCountPair[])e.NewValue;
}

感谢所有试图提供帮助的人!