如何在UserControl中使用绑定的XAML属性?

时间:2015-12-02 01:07:31

标签: c# xaml windows-phone-8.1 uwp

我有自己的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));

我做错了什么?我想用这个字符串做一些事情。但它总是无效。

2 个答案:

答案 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的值。