【问题标题】:How to use bound XAML property in UserControl?如何在 UserControl 中使用绑定的 XAML 属性?
【发布时间】:2015-12-02 01:07:31
【问题描述】:

我有自己的UserControl

 <local:MyUserControl MyProperty="{Binding myString}"/>                                      

我将myString 绑定到它。现在我想在我的UserControl 中使用它。我在UserControl 中定义了DependencyProperty

    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));

我做错了什么?我想用这个字符串做一些事情。但它始终为空。

【问题讨论】:

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


【解决方案1】:

Debug.WriteLine(value); 什么也不写,不是因为值是null。依赖属性的 getter 和 setter 不保证会运行,而使用 {Binding} 时,不会调用您的属性的 setter。您可以在 setter 中添加断点进行测试。

请注意Custom dependency properties中的以下注意事项:

除特殊情况外,您的包装器实现应仅执行 GetValue 和 SetValue 操作。否则,通过 XAML 设置属性与通过代码设置属性时,您将获得不同的行为。为了提高效率,XAML 解析器在设置依赖属性时会绕过包装器;只要有可能,它就会使用依赖属性的注册表。

您可以在对DependencyProperty.Register 的原始调用中添加属性更改处理程序,而不是在属性的设置器中做出反应,并且在此处理程序中您可以对新值进行操作。例如:

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 中使用绑定字符串,你可以使用UserControl 中的MyProperty。例如:

在你的UserControl:

<UserControl Name="root" ...>
    <StackPanel>
        <TextBlock Text="{Binding MyProperty, ElementName=root}" />
    </StackPanel>
</UserControl> 

那么当你使用&lt;local:MyUserControl MyProperty="{Binding myString}"/&gt;时,你的UserControl会显示myString的值。

【讨论】:

  • 谢谢,但是假设我有两个属性 MyProperty 和 MyProperty2 都是字符串,我想将它们传递给其他方法对它们进行一些操作,然后从这个方法更新 MyUserControl 的 UI。虽然 OnPropertyChanged 是静态的,但我无法从此事件中调用非静态方法。
  • 没有您的代码,我无法进一步帮助您。我认为您需要对更新的代码提出一个新问题。
【解决方案2】:

如果您使用 c# 命名约定 - 字段是驼峰式 - 您将这些内容绑定到一个字段 (myString)。它不工作。您必须绑定到一个属性(Pascalcase - get;set; ...等)。 在这种情况下,您的输出窗口中有一个绑定错误。

依赖属性的默认设置是 OneWay 绑定,这意味着如果用户控件更改了它不会反映在 DataContext 中的字符串。

将您的绑定更改为 TwoWay

<local:MyUserControl MyProperty="{Binding myString, Mode=TwoWay}"/>      

或将您的 DependencyProp 更改为 TwoWay 模式:

DependencyProperty.Register("MyString", typeof(string), typeof(MyUserControl), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多