2017-10-28 345 views
0

我创建了一个自定义控件,表示从控制关联通过Themes/Generic.xaml定义的默认不寻常主题的派生类。到现在为止还挺好。WPF绑定到自定义控件的属性

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

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

嗯,这里就是我这么远:

在自定义控件类中,有如下:

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属性从不受影响,从不改变它的值。

我在做什么错?

回答

0

的结合,应该是双向的,以更新源属性:

<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是完全多余的。当它的值刚刚改变时,不需要再次设置属性。

+0

非常感谢!我假设,默认情况下BindingMode是TwoWay。现在,我已经设置了BindingMode,一切正常。再次感谢! – Elex