有人请帮助我理解为什么这种绑定不起作用......
我有一个名为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。
答案 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;
}
感谢所有试图提供帮助的人!