【问题标题】:Binding source not updating when DependencyProperty's value is set to null当 DependencyProperty 的值设置为 null 时,绑定源不更新
【发布时间】:2020-01-31 00:01:24
【问题描述】:

我有一个自定义的用户控件。它由一个 TextBox 和一个 Button 组成。此用户控件的目标是允许用户查看通过绑定在 XAML 中设置的对象的 ToString() 内容,并允许用户将对象设置为 NULL。 这是 UserControl 的 XAML 和 C# 代码

<UserControl
    <Grid>
        <TextBox Text="{x:Bind SelectedObject.ToString(), Mode=OneWay}" IsReadOnly="True" />
        <Button Click="buttonDeselectObject_Click" IsEnabled="True" Content="X"/>
    </Grid>
</UserControl>
public sealed partial class ObjectSelectorBox : UserControl 
{
    public ObjectSelectorBox ()
    {
        this.InitializeComponent ();

        textBoxSelectedObject.AddHandler (TappedEvent, new TappedEventHandler (TextBox_Tapped), true);
    }

    public object SelectedObject 
    {
        get => GetValue (SelectedObjectProperty);
        set => SetValue (SelectedObjectProperty, value);
    }

    public static readonly DependencyProperty SelectedObjectProperty = DependencyProperty.Register ("SelectedObject", typeof (object), typeof (ObjectSelectorBox), null);

    private void buttonDeselectObject_Click (object sender, RoutedEventArgs e) 
    {
        //This is where the SelectedObject binding source should be set to NULL

        SelectedObject = null; //This works but does NOT reflect to the binding source
        SelectedObject = "123"; //This works and does reflect to the binding source
    }
}

这就是我在 UWP 页面中使用它的方式:

<local1:ObjectSelectorBox SelectedObject="{x:Bind TestObject, Mode=TwoWay}"/>

当用户按下按钮时,SelectedObject 值应设置为 null。虽然这确实有效,但更改不会反映到 TestObject(字符串)的绑定源。 但是,当我将 SelectedObject 值设置为“123”或“abc”等其他值时,更改会正确反映到 TestObject。 这种行为是故意的吗?有没有办法将其更改为 SelectedObject 始终反映到绑定源?

【问题讨论】:

  • 您的绑定尝试在空对象上调用 .ToString(),然后失败。
  • 哦。哇。我没有意识到这一点。我必须习惯于引发异常和 Visual Studio 喂我。叹。无论如何,非常感谢你:D

标签: c# uwp binding


【解决方案1】:

当 DependencyProperty 的值设置为 null 时,绑定源不更新

Iuri Farenzena 的评论是正确的,使用 null 对象调用 ToString() 时失败。为什么我们不能在 Visual Studio 中得到异常。因为异常已在内部捕获并停止反映到绑定源。

根据您的要求,请使用string.Empty替换null。

SelectedObject = string.Empty

更新

运维的解决方案

实现自定义IValueConverter 并使用value?.ToString() 来确定值是否为空。

【讨论】:

  • 非常感谢您的澄清。我最终实现了一个自定义的 IValueConverter,它执行 value?.ToString().
猜你喜欢
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2011-07-25
  • 2019-06-01
  • 2011-01-05
相关资源
最近更新 更多