依赖属性与视图模型绑定用户控件 [英] Dependency property binding usercontrol with a viewmodel

查看:159
本文介绍了依赖属性与视图模型绑定用户控件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从本质上讲,我有包含这势必会在主窗口的视图模型的属性就可以了用户控件的主窗口。我们的想法是,当在用户窗体属性的变化,通过在主窗口视图模型绑定属性也将改变。问题是,这个工程在用户控件没有视图模型,当我添加了一个简单的ViewModel到用户控件,绑定不再有效。当我需要有一个视图模型为我控制,我需要工作,为什么添加视图模型被打破约束力,如何解决它。 。任何建议欢迎

 公共部分类控制1:用户控件,INotifyPropertyChanged的
{
公共控制1()
{
的InitializeComponent();
加载+ = Control1_Loaded;
}

无效Control1_Loaded(对象发件人,RoutedEventArgs E)
{
的DataContext =新Control1ViewModel();
}

公共静态的DependencyProperty SavedStringProperty = DependencyProperty.Register(
SavedString的typeof(串),typeof运算(控制1));
公共字符串SavedString
{
得到
{
返回(串)的GetValue(SavedStringProperty);
}

{
的SetValue(SavedStringProperty,值);
}
}

公共事件PropertyChangedEventHandler的PropertyChanged;


私人无效FirePropChanged(字符串属性)
{
如果(的PropertyChanged!= NULL)
的PropertyChanged(这一点,新PropertyChangedEventArgs(属性));
}

私人无效Button_Click_1(对象发件人,RoutedEventArgs E)
{
SavedString =嗨;
}
}

公共类MainWindowViewModel:INotifyPropertyChanged的
{
私人字符串_message =嗨;
公共字符串myMessage
{
得到
{
返回_message;
}

{
_message =价值;
FirePropChanged(myMessage);
}
}
公共事件PropertyChangedEventHandler的PropertyChanged;

私人无效FirePropChanged(字符串属性)
{
如果(的PropertyChanged!= NULL)
的PropertyChanged(这一点,新PropertyChangedEventArgs(属性));
}



私人字符串_savedString;
公共字符串SavedString
{
得到
{
返回_savedString;
}

{
_savedString =价值;
FirePropChanged(SavedString);
}
}
}



XAML(在主窗口):

 < myCtrl:控制1 SavedString ={绑定路径= SavedString,模式=双向}/> 



CS(我的UC视图模式):

 公共类Control1ViewModel:INotifyPropertyChanged的
{
公共事件PropertyChangedEventHandler的PropertyChanged;
}


解决方案

当你的UC有它自己的虚拟机即它自己的DataContext,
你需要爬上可视化树,并指这是父母的(窗口)的DataContext

 < myCtrl:控制1 SavedString ={绑定的RelativeSource = {的RelativeSource 
AncestorType =窗口}路径= DataContext.SavedString,模式=双向}/>


Essentially, I have a main window with a user control on it containing a property which is bound to the view model of the main window. The idea is that when the property changes in the user form that by the binding the property in the main window viewmodel will also change. The problem is that this works when the user control has no ViewModel, when I add a simple ViewModel to the user control, the binding no longer works. And as I need to have a ViewModel for my control I need to work out why adding the ViewModel is breaking the binding and how to fix it. Any suggestions welcomed.

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 (in MainWindow) :

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

cs (my uc viewmode):

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

解决方案

When your UC has it's own Vm i.e. it's own DataContext , you need to climb up the visual tree and refer to it's parent's (Window) DataContext

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

这篇关于依赖属性与视图模型绑定用户控件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆