0

我正在尝试将自定义控件的依赖属性绑定到其 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});
            }
   }

视图模型看起来像:


-------

public class MyCustomControlViewModel: ObservableObject
{
    private string _text;


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

----------

由于某种原因,此“文本”属性的绑定不起作用。

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

非常感谢您对此的任何帮助。

4

3 回答 3

1

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

//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;
}

这是我唯一缺少的东西。

干杯

于 2012-10-10T15:39:27.847 回答
0

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

于 2012-10-07T20:38:53.547 回答
0

只需绑定到依赖属性

<MyCustomControl Text="{Binding Path=Text}" />
于 2012-10-05T23:51:44.940 回答