gpt4 book ai didi

c# - UI 未针对绑定(bind)元素进行更新

转载 作者:太空宇宙 更新时间:2023-11-03 22:52:27 25 4
gpt4 key购买 nike

我的属性更新得很好,但我的用户界面没有更新。我究竟做错了什么?

我还尝试不在 XAML 中设置 DataContext,而是在构造函数后面的代码中设置,但这也不起作用。

View 模型:

public class MainWindowViewModel : INotifyPropertyChanged
{
public MainWindowViewModel()
{
TestCommand = new RelayCommand(UpdateTest);
}

#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;


protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
if (PropertyChanged != null)
PropertyChanged(null, new PropertyChangedEventArgs(propertyName));
}
#endregion

private string _test;
public string Test
{
get { return _test; }
set
{
_test = value;
NotifyPropertyChanged();
}
}

public ICommand TestCommand { get; set; }

public void UpdateTest()
{
Test += "test ";
}
}

查看:

<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Test"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBox Grid.Row="0" Text="{Binding Test}" />
<Button Grid.Row="1" Content="Test 2" Command="{Binding TestCommand}" />
</Grid>
</Window>

最佳答案

您没有正确实现 PropertyChanged。 .NET 的事件模型要求将调用的委托(delegate)的 sender 参数设置为实际引发事件的对象的引用。您将该值设置为 null。您的代码应该使用 this 代替:

protected void NotifyPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

请注意,为了线程安全,您也不应该在事件字段本身上使用“检查并引发”模式。您应该改为将字段存储在局部变量中,检查局部变量,然后从该变量引发事件(如果非空)。上面使用 ?. 运算符(“空条件运算符”)有效地做到了这一点;编译器为您隐式生成局部变量,并确保引用在您检查它是否为 null 和您实际尝试使用它的时间之间不会发生变化。

关于c# - UI 未针对绑定(bind)元素进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46843716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com