phc*_*ing 3 c# wpf xaml dependency-properties mvvm
本质上,我有一个主窗口,其上有一个用户控件,包含一个绑定到主窗口视图模型的属性.这个想法是当属性在用户表单中发生变化时,通过绑定主窗口视图模型中的属性也会发生变化.问题是,当用户控件没有ViewModel时,这是有效的,当我向用户控件添加一个简单的ViewModel时,绑定不再起作用.因为我需要为我的控件设置ViewModel,所以我需要弄清楚为什么添加ViewModel会破坏绑定以及如何修复它.欢迎任何建议.
public partial class Control1 : UserControl, INotifyPropertyChanged
{
public Control1()
{
InitializeComponent();
Loaded += Control1_Loaded;
}
void Control1_Loaded(object sender, RoutedEventArgs e)
{
DataContext = new Control1ViewModel();
}
public static DependencyProperty SavedStringProperty = DependencyProperty.Register(
"SavedString", typeof(string), typeof(Control1));
public string SavedString
{
get
{
return (string)GetValue(SavedStringProperty);
}
set
{
SetValue(SavedStringProperty, value);
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void FirePropChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
SavedString = "Hi";
}
}
public class MainWindowViewModel : INotifyPropertyChanged
{
private string _message = "Hi";
public string myMessage
{
get
{
return _message;
}
set
{
_message = value;
FirePropChanged("myMessage");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void FirePropChanged(string property)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
private string _savedString;
public string SavedString
{
get
{
return _savedString;
}
set
{
_savedString = value;
FirePropChanged("SavedString");
}
}
}
Run Code Online (Sandbox Code Playgroud)
xaml(在MainWindow中):
<myCtrl:Control1 SavedString="{Binding Path=SavedString, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)
cs(我的uc viewmode):
public class Control1ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
}
Run Code Online (Sandbox Code Playgroud)
当您的UC拥有自己的Vm,即它自己的DataContext时,您需要爬上可视树并引用它的父级(Window)DataContext
<myCtrl:Control1 SavedString="{Binding RelativeSource={RelativeSource
AncestorType=Window} Path=DataContext.SavedString, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)