x:Bind TwoWayBinding 不适用于 Textblock
x:Bind TwoWayBinding not working on Textblock
我正在尝试使用编译绑定 x:Bind
使双向绑定在 Textblock
上工作
问题:
即使设置 TwoWay 绑定模式和 PropertyChanged 源触发器。不能让它工作。当对象 属性 余额在其背后的代码中更改时,它不会在 UI 中更新。
下面是代码。
XAML
<TextBlock x:Name="Balance"
Text="{x:Bind classObject.Balance,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
代码隐藏
private ClassName classObject = new ClassName() { Name = "Foo",Balance = 100 };
public Observable ViewModel { get; } = new Observable();
private void NavLinksList_ItemClick(object sender,ItemClickEventArgs e)
{
classObject = new ClassName() { Name = "Blah",Balance = 10 * new Random().NextDouble() * (50 - 1) + 1 };
}
可观察
public class Observable : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
{
return;
}
storage = value;
OnPropertyChanged(propertyName);
}
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
备选方案
手动在后台代码中设置Textblock.Text
。
但问题是 属性 changed 事件应该有效并自动更新文本块而无需显式编码。
我搜索了其他问题,但找不到类似的问题。
如果您想更新 TextBlock
的数据绑定 Text
属性,您应该设置它绑定的源 属性,即 Balance
属性 共 classObject
。另请注意,ClassName
class 应实现 INotifyPropertyChanged
接口并引发更改通知。
将 classObject
字段设置为 ClassName
的新实例不应更新 TextBlock
,除非您之后调用 Bindings.Update()
。
我正在尝试使用编译绑定 x:Bind
Textblock
上工作
问题: 即使设置 TwoWay 绑定模式和 PropertyChanged 源触发器。不能让它工作。当对象 属性 余额在其背后的代码中更改时,它不会在 UI 中更新。
下面是代码。
XAML
<TextBlock x:Name="Balance"
Text="{x:Bind classObject.Balance,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
代码隐藏
private ClassName classObject = new ClassName() { Name = "Foo",Balance = 100 };
public Observable ViewModel { get; } = new Observable();
private void NavLinksList_ItemClick(object sender,ItemClickEventArgs e)
{
classObject = new ClassName() { Name = "Blah",Balance = 10 * new Random().NextDouble() * (50 - 1) + 1 };
}
可观察
public class Observable : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(storage, value))
{
return;
}
storage = value;
OnPropertyChanged(propertyName);
}
protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
备选方案
手动在后台代码中设置Textblock.Text
。
但问题是 属性 changed 事件应该有效并自动更新文本块而无需显式编码。
我搜索了其他问题,但找不到类似的问题。
如果您想更新 TextBlock
的数据绑定 Text
属性,您应该设置它绑定的源 属性,即 Balance
属性 共 classObject
。另请注意,ClassName
class 应实现 INotifyPropertyChanged
接口并引发更改通知。
将 classObject
字段设置为 ClassName
的新实例不应更新 TextBlock
,除非您之后调用 Bindings.Update()
。