gpt4 book ai didi

c# - WPF - MVVM - 用户控件绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 10:32:00 30 4
gpt4 key购买 nike

我试图实现一个简单的用户控件示例,在文本框中显示当前日期时间,每秒更新四次。

我创建了一个简单的用户控件:

<UserControl x:Class="UC.TestUC"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:UC"
mc:Ignorable="d"
d:DesignHeight="50" d:DesignWidth="100">
<d:UserControl.DataContext>
<local:TestUC_VM/>
</d:UserControl.DataContext>
<Grid Background="Azure">
<TextBox Text="{Binding TestString}"/>
</Grid>
</UserControl>

它的 ViewModel 在哪里:
namespace UC
{
public class TestUC_VM : INotifyPropertyChanged
{
private string _testString;
public string TestString
{
get => _testString;
set
{
if (value == _testString) return;
_testString = value;
OnPropertyChanged();
}
}

public TestUC_VM()
{
TestString = "Test string.";
}

public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}

主窗口 XAML:
<Window x:Class="UC.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:UC"
mc:Ignorable="d"
Title="MainWindow" Height="100" Width="200">
<Window.DataContext>
<local:MainWindow_VM/>
</Window.DataContext>
<Window.Resources>
<local:TestUC_VM x:Key="TestUC_VM"/>
</Window.Resources>
<Grid>
<local:TestUC DataContext="{StaticResource TestUC_VM}"/>
</Grid>
</Window>

及其 View 模型:
namespace UC
{
public class MainWindow_VM
{
public TestUC_VM _uc_VM;

public MainWindow_VM()
{
_uc_VM = new TestUC_VM();
Task.Run(() => ChangeString());
}

public async Task ChangeString()
{
while (true)
{
_uc_VM.TestString = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
await Task.Delay(250);
}
}
}
}

即使我通过调试器看到我正在通过 TestString setter ,但 MainWindow 没有更新。
我很确定我在 MainWindow 中设置 UC 的 DataContext 时遗漏了一些微不足道的东西,但经过几个小时的浏览和思考,我还是找不到什么。

任何帮助表示赞赏。

最佳答案

表达方式

<local:TestUC DataContext="{StaticResource TestUC_VM}"/>

将 TestUC_VM 资源的值分配给 UserControl 的 DataContext。这是与 _uc_VM 不同的对象。主视图模型的成员,稍后您将对其进行更新。

将成员变成公共(public)属性(property)
public TestUC_VM UcVm { get; } = new TestUC_VM();

和写
<local:TestUC DataContext="{Binding UcVm}"/>

像这样更新 View 模型:
UcVm.TestString = ...

关于c# - WPF - MVVM - 用户控件绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55219357/

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