我在WP7应用程序中使用标准数据透视模板。
我使用一些额外的属性定义了MainViewModel类:
public class MainViewModel : INotifyPropertyChanged
{
...
private MyClass selectedKey_m;
public MyClass SelectedKey
{
get
{
...
}
set
{
if (value != this.selectedKey_m)
{
this.selectedKey_m = value;
NotifyPropertyChanged("SelectedKey");
}
}
}
}
App类有一个视图模型实例:
private static MainViewModel viewModel = null;
public static MainViewModel ViewModel
{
get
{
// Delay creation of the view model until necessary
if (viewModel == null)
viewModel = new MainViewModel();
return viewModel;
}
}
My MainPage.xaml.cs设置DataContext:
DataContext = App.ViewModel;
从这里开始,我可以在ListBoxes上设置双向绑定,我知道它有效,因为如果我在viewmodel中的SelecetdKey属性上放置一个断点,我可以看到setter被调用。
我的问题是我有自己的用户控件,带有绑定属性,绑定到视图模型的SelectedKey属性,但是当viewmodel更新时我的用户控件中的属性永远不会被设置,我无法想象为什么。
这是我的用户控件:
public partial class MyUserControl : UserControl
{
public static readonly DependencyProperty SelectedKeyProperty = DependencyProperty.Register(
"SelectedKey", typeof(MyClass), typeof(MyUserControl), new PropertyMetadata(null));
public MyClass SelectedKey
{
get { return (MyClass)this.GetValue(SelectedKeyProperty); }
set { this.SetValue(SelectedKeyProperty, value); }
}
}
这是我主页中的xaml:
<local:MyUserControl x:Name="myUC" SelectedKey="{Binding Path=SelectedKey}">
我希望当视图模型的SelectedKey属性发生更改时,我的用户控件的SelectedKey属性的setter会被调用,但事实并非如此。
我也尝试在xaml中设置用户控件的datacontext:
DataContext="{Binding Path=App.ViewModel}"
答案 0 :(得分:0)
调试器不会进入设置器,不知道为什么。
尝试添加对属性值更改调用的回调:
public static readonly DependencyProperty SelectedKeyProperty = DependencyProperty.Register(
"SelectedKey", typeof(MyClass), typeof(MyUserControl), new PropertyMetadata(MyPropertyChanged));
private static void MyPropertyChanged( object sender, DependencyPropertyChangedEventArgs args)
{
}
答案 1 :(得分:0)
解决。我必须将静态方法添加为ptauzen suggested,但也从我的xaml中删除DataContext绑定语句:
DataContext="{Binding Path=App.ViewModel}"
因为MainPage在构造函数中设置了datacontext,所以因为我的用户控件是主页面的子控件,所以它继承了数据上下文。我只需要确保设置用户控件属性的绑定:
SelectedKey="{Binding SelectedKey}"