我有自己的UserControl
<local:MyUserControl MyProperty="{Binding myString}"/>
我正在绑定myString
。现在我想在我的UserControl
中使用它。我在DependencyProperty
中定义了UserControl
:
public string MyProperty
{
get { return (string)GetValue(MyPropertyProperty); }
set
{
Debug.WriteLine(value);//writes nothing, null
SetValue(MyPropertyProperty, value);
}
}
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(string), typeof(MyUserControl), new PropertyMetadata(null));
我做错了什么?我想用这个字符串做一些事情。但它总是无效。
答案 0 :(得分:1)
如果你使用了c#命名约定 - 字段是camelcase - 你将这些东西绑定到一个字段( myString )。它不起作用。你必须绑定到一个属性(Pascalcase - get; set; ... etc)。 在这种情况下,输出窗口中存在绑定错误。
依赖项属性的默认设置是 OneWay 绑定,这意味着如果usercontrol更改了它未在DataContext中反映的字符串。
将绑定更改为 TwoWay
<local:MyUserControl MyProperty="{Binding myString, Mode=TwoWay}"/>
或将您的DependencyProp更改为 TwoWay 模式:
DependencyProperty.Register("MyString", typeof(string), typeof(MyUserControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
答案 1 :(得分:1)
Debug.WriteLine(value);
没有写任何内容,因为值为null
。不保证依赖属性的getter和setter可以运行,而使用{Binding}
时,不会调用属性的setter。您可以在setter中添加一个断点来测试它。
请注意Custom dependency properties中的注意事项:
除了特殊情况外,您的包装器实现应该只执行GetValue和SetValue操作。否则,当您通过XAML设置属性时,通过代码设置属性时,您将获得不同的行为。为了提高效率,XAML解析器在设置依赖项属性时会绕过包装器;只要有可能,它就会使用依赖属性的注册表。
您可以在原始调用DependencyProperty.Register
中添加属性更改处理程序,而不是在属性的setter中进行响应,并且可以在此处理程序中对新值执行操作。例如:
public string MyProperty
{
get { return (string)GetValue(MyPropertyProperty); }
set
{
SetValue(MyPropertyProperty, value);
}
}
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(string), typeof(MyUserControl), new PropertyMetadata(null, OnPropertyChanged));
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if ((string)e.NewValue != (string)e.OldValue)
{
Debug.WriteLine(e.NewValue);
}
}
如果您想在UserControl
中使用绑定字符串,可以使用MyProperty
的{{1}}。例如:
在UserControl
:
UserControl
然后当您使用<UserControl Name="root" ...>
<StackPanel>
<TextBlock Text="{Binding MyProperty, ElementName=root}" />
</StackPanel>
</UserControl>
时,您的<local:MyUserControl MyProperty="{Binding myString}"/>
会显示UserControl
的值。