WPF绑定到自定义控件的属性

时间:2017-10-28 09:12:49

标签: wpf binding custom-controls dependency-properties

我创建了一个自定义控件,意味着一个派生自控件的类,该控件关联通过Themes / Generic.xaml定义的默认无外观主题。到目前为止一切都很好。

现在,我想像其他主要WPF控件一样使用控件(文本框,列表框,标签,文本块......)并绑定到已定义的属性。

自定义控件定义了一个名为Value的属性,我想将Binding设置为。但是没有任何东西写入DataContext中的bound属性。

嗯,这是我到目前为止所得到的:

在Custom Control类中,有以下内容:

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
    "Value", typeof(string), typeof(MyClass),
    new FrameworkPropertyMetadata("", new PropertyChangedCallback(onValuePropertyChangedCallback)));

private static void onValuePropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs args)
{
    MyClass myClass = (MyClass)sender;
    myClass.Value = (string)args.NewValue;
}

public string Value
{
    get { return (string) GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

当我使用控件时,它就像那样

<local:MyClass MyValue="{Binding CurrentValue}" ... />

DataContext的CurrentValue属性永远不会受到影响,永远不会改变它的值。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

Binding to应该是双向的,以便更新源属性:

<local:MyClass Value="{Binding CurrentValue, Mode=TwoWay}" ... />

如果您希望这是默认的绑定模式,您可以在注册属性时设置适当的标记:

public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
    nameof(Value), typeof(string), typeof(MyClass),
    new FrameworkPropertyMetadata(
        "", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

public string Value
{
    get { return (string)GetValue(ValueProperty); }
    set { SetValue(ValueProperty, value); }
}

请注意,您的onValuePropertyChangedCallback完全是多余的。当它的值刚刚改变时,你不需要再次设置属性。