如何将自定义控件的依赖项属性绑定到其视图模型属性

时间:2012-10-05 23:44:07

标签: c# wpf mvvm binding viewmodel

我正在尝试将自定义控件的依赖项属性绑定到其ViewModel的属性。

自定义控件如下所示:


    public partial class MyCustomControl : Canvas
    {
            //Dependency Property
            public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyCustomControl));


            private VisualCollection controls;
            private TextBox textBox;

            public string Text
            {
                get { return textBox.Text; }
                set 
                {
                    SetValue(TextProperty, value);
                    textBox.Text = value;
                }
            }

            //Constructor
            public MyCustomControl ()
            {
                controls = new VisualCollection(this);
                InitializeComponent();

                textBox = new TextBox();
                textBox.ToolTip = "Start typing a value.";

                controls.Add(textBox);

                //Bind the property
                this.SetBinding(TextProperty, new Binding("Text") {Mode = BindingMode.TwoWay, Source = DataContext});
            }
   }

View Model看起来像:


-------

public class MyCustomControlViewModel: ObservableObject
{
    private string _text;


    public string Text
    {
        get { return _text; }
        set { _text = value; RaisePropertyChanged("Text");}
    }
}

----------

“Text”属性的此绑定由于某种原因无效。

我想要做的是,在实际实现中,我希望在更新基础ViewModel的Text属性时更新MyCustom Control的text属性。

非常感谢任何有关此事的帮助。

3 个答案:

答案 0 :(得分:1)

经过一番研究后,我终于找到了我的代码问题。我通过创建一个静态事件处理程序来实现此代码,该处理程序实际上将新属性值设置为依赖项属性的基础公共成员。 Dependency属性声明如下:

//Dependency Property
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyCustomControl), new PropertyMetadata(null, OnTextChanged));

然后定义设置属性的静态方法如:

private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyCustomControl myCustomControl = (MyCustomControl)d;
    myCustomControl.Text = (string) e.NewValue;
}

这是我唯一缺少的东西。

干杯

答案 1 :(得分:0)

只需绑定到依赖项属性

<MyCustomControl Text="{Binding Path=Text}" />

答案 2 :(得分:0)

您应该将您的成员TextBox绑定到TextProperty。我很确定你的Text属性中xaml中的绑定会覆盖你在构造函数中创建的那个。