【发布时间】:2010-11-18 02:11:48
【问题描述】:
我正在尝试实现一些概念上非常简单但似乎无法让它发挥作用的东西。
我有一个名为 c1 的类,它有 2 个依赖属性,一个整数 I 和一个字符串 S。它实现了 INotifiyPropertyChanged。
public class c1: INotifyPropertyChanged
{
private int i;
public int I { get { return i; } set { i = value; if(PropertyChanged != null) PropertyChanged(this,new PropertyChangedEventArgs("I")); } }
private string s;
public string S { get { return s; } set { s = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("S")); } }
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
此类由 Silverlight 用户控件 SUC 引用,该控件还实现 INotifiyPropertyChanged 作为依赖属性 C,具有 PropertyChangedCallback 等。如下所示。
public partial class SUC : UserControl, INotifyPropertyChanged
{
public c1 C
{
get { return (c1)GetValue(CProperty); }
set { SetValue(CProperty, value); }
}
public static readonly DependencyProperty CProperty =
DependencyProperty.Register("C", typeof(c1), typeof(SUC), new PropertyMetadata(new c1(), new PropertyChangedCallback(c1Changed)));
private static void c1Changed(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
SUC s = obj as SUC;
if (s != null)
s.CChanged((c1)e.NewValue);
}
public void CChanged(c1 c)
{
C = c;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("C"));
}
public SUC()
{
InitializeComponent();
this.DataContext = this;
}
private void bclick(object sender, RoutedEventArgs e)
{
C.S = C.S + " Clicked";
MessageBox.Show(C.I.ToString() + " - " + C.S);
}
public event PropertyChangedEventHandler PropertyChanged;
}
在我也实现 INotifiyPropertyChanged 的主页中,我有一个 c1 和 SUC 的实例。
public partial class MainPage : UserControl, INotifyPropertyChanged
{
public c1 MC
{
get { return (c1)GetValue(MCProperty); }
set { SetValue(MCProperty, value); }
}
public static readonly DependencyProperty MCProperty =
DependencyProperty.Register("MC", typeof(c1), typeof(MainPage), new PropertyMetadata(new c1()));
private static void MCChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MainPage mp = d as MainPage;
if (mp != null)
mp.MCChanged();
}
public void MCChanged()
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("MC"));
}
public MainPage()
{
InitializeComponent();
MC.S = "ssss";
this.DataContext = this;
}
public event PropertyChangedEventHandler PropertyChanged;
}
我想通过 XAML 设置 SUC 用户控件的 C 属性。像这样
local:SUC x:Name="suc" C="{Binding MC, Mode=TwoWay}"
这在后面的 c# 代码中运行良好,但在 XAML 中却不行。我在 XAML 中需要它的原因是因为我想将 c1 的集合绑定到 DataTemplate 中的 SUC。
任何带有可下载代码的工作示例将不胜感激。
【问题讨论】:
标签: silverlight data-binding user-controls