依赖属性将用户控件绑定到视图模型

3
基本上,我有一个包含属性的用户控件的主窗口,该属性绑定到主窗口的视图模型。想法是,当用户表单中的属性更改时,通过绑定主窗口视图模型中的属性也会更改。问题在于,当用户控件具有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");
        }
    }
}

在MainWindow中的xaml:

<myCtrl:Control1 SavedString="{Binding Path=SavedString, Mode=TwoWay}"/>

cs(我的 UC 视图模式):


 public class Control1ViewModel : INotifyPropertyChanged
 {
      public event PropertyChangedEventHandler PropertyChanged;       
 }
2个回答

7

当你的 UC 拥有自己的 Vm 即自己的数据上下文时,你需要沿着可视树向上爬并引用它的父类 (Window) 的数据上下文。

<myCtrl:Control1 SavedString="{Binding RelativeSource={RelativeSource 
    AncestorType=Window} Path=DataContext.SavedString, Mode=TwoWay}"/>

@phcoding,你是用路径写的RelativeSource吗?这样做有什么影响吗? - eran otzap
@phcoding,你把答案示例回复给回答你的用户,有什么原因吗?这似乎是不必要的。 - Sheridan
@eranotzap,那并没有什么区别...这就是为什么我想知道为什么phcoding觉得有必要把你的答案发给你。 - Sheridan
这个想法其实是对的,但语法对我不起作用,所以为了帮助其他用户,我想发布一下对我有用的语法。 - phcoding
这就是我所问的,我和谢里丹都认为这并不重要。 - eran otzap
显示剩余2条评论

0

还有一种用元素名称来编写它的方法:

SavedStrings="{Binding ElementName=uc_name, Path=DataContext.SavedString}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接