【问题标题】:Dependency property binding usercontrol with a viewmodel依赖属性绑定用户控件与视图模型
【发布时间】:2013-11-19 12:11:02
【问题描述】:

基本上,我有一个主窗口,上面有一个用户控件,其中包含一个绑定到主窗口视图模型的属性。这个想法是,当用户表单中的属性发生变化时,通过绑定主窗口视图模型中的属性也会发生变化。问题是当用户控件没有 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");
        }
    }
}

xaml(在主窗口中):

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

cs(我的 uc 视图模式):

 public class Control1ViewModel : INotifyPropertyChanged
 {
      public event PropertyChangedEventHandler PropertyChanged;       
 }

【问题讨论】:

    标签: c# wpf xaml mvvm dependency-properties


    【解决方案1】:

    当您的 UC 拥有自己的 Vm 时,即拥有自己的 DataContext , 您需要爬上可视化树并参考它的父级(窗口)DataContext

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

    【讨论】:

    • @phcoding 如果您在 RelativeSource 之前使用路径编写它,这有关系吗?
    • @phcoding,您是否有任何理由将答案示例发回给回答您的用户?似乎没有必要。
    • @eranotzap,不,这没有任何区别......这就是为什么我想知道为什么 phcoding 觉得有必要将你的答案发回给你。
    • @Sheridan 我不这么认为.. 我只是想了解他为什么将我的回答回复给我.. 很奇怪 :)
    • 这个想法实际上是正确的,但语法对我不起作用,所以为了帮助其他用户,我想我会发布对我有用的语法。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多