我有一个自定义的UserControl。它由一个TextBox和一个Button组成。该用户控件的目的是允许用户查看对象的ToString()内容,该内容通过绑定在XAML中设置,还允许他们将对象设置为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始终反映到绑定源?
答案 0 :(得分:0)
当DependencyProperty的值设置为null时,绑定源不会更新
Iuri Farenzena的注释正确,当使用空对象调用ToString()
时,注释将失败。为什么我们在Visual Studio中无法获得异常。因为异常已在内部捕获,并停止反映到绑定源。
根据您的要求,请使用string.Empty
替换空值。
SelectedObject = string.Empty
更新
Op的解决方案
实施自定义IValueConverter
并使用value?.ToString()
确定值是否为空。