WPF 绑定到自定义控件的 属性
WPF Binding to a property of a custom control
我已经创建了一个自定义控件,这意味着 class 派生自控件,该控件与通过 Themes/Generic.xaml 定义的默认外观主题相关联。到目前为止一切顺利。
现在,我想像使用任何其他主要 WPF 控件(文本框、列表框、标签、文本块...)一样使用该控件并绑定到已定义的属性。
自定义控件定义了一个名为 Value 的 属性,我想将其设置为 Binding。但是没有任何内容被写入 DataContext 中的绑定 属性。
好吧,这是我目前所知道的:
自定义控件class中有如下内容:
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-属性 从不受影响,从不改变它的值。
我做错了什么?
绑定到应该是双向的,以便更新源 属性:
<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
完全是多余的。当 属性 的值刚刚改变时,您不需要再次设置它。
我已经创建了一个自定义控件,这意味着 class 派生自控件,该控件与通过 Themes/Generic.xaml 定义的默认外观主题相关联。到目前为止一切顺利。
现在,我想像使用任何其他主要 WPF 控件(文本框、列表框、标签、文本块...)一样使用该控件并绑定到已定义的属性。
自定义控件定义了一个名为 Value 的 属性,我想将其设置为 Binding。但是没有任何内容被写入 DataContext 中的绑定 属性。
好吧,这是我目前所知道的:
自定义控件class中有如下内容:
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-属性 从不受影响,从不改变它的值。
我做错了什么?
绑定到应该是双向的,以便更新源 属性:
<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
完全是多余的。当 属性 的值刚刚改变时,您不需要再次设置它。