视图模型更改后 WPF 组件内容未更新

WPF component content not updating after view model change

我有以下视图模型:

public class ViewModel : ObservableObject
{
    public string Watermark { get; set; } = "Loading...";
}

其中 ObservableObject 来自 Microsoft.Toolkit.Mvvm.ComponentModel,它实现了 INotifyPropertyChangedINotifyPropertyChanging

我有以下 XAML:

<xctk:WatermarkTextBox>
    <xctk:WatermarkTextBox.WatermarkTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding DataContext.Watermark, RelativeSource={RelativeSource AncestorType=Window}}"></ContentControl>
        </DataTemplate>
    </xctk:WatermarkTextBox.WatermarkTemplate>
</xctk:WatermarkTextBox>

最后是以下 C# 代码:

private async void Window_Loaded(object sender, RoutedEventArgs e)
{
    Dispatcher.Invoke(() =>
    {
        // Assigning property of textbox directly with .Watermark = "" does not work

        // Updating view model property doesn't work either
        Model.Watermark = "Done";
    });
}

然而,当调用 window 加载方法时,水印文本框的水印不会更新以反映其假设的新值,"Done"

这可能是缺乏对 WPF 的一般理解,但如果有人能指出为什么这可能会失败,我将不胜感激。

谢谢!

您没有正确使用 ObservableObject。这并不神奇(不像某些使用框架的解决方案,例如 Fody),因此您仍然必须自己完成传播更改的工作。请注意 the documentation.

中的示例
public class User : ObservableObject
{
    private string name;

    public string Name
    {
        get => name;
        set => SetProperty(ref name, value);
    }
}

因此您必须遵循该模式:

public class ViewModel : ObservableObject
{
    private string watermark;

    public ViewModel() 
    {
        Watermark = "Loading...";
    }

    public string Watermark
    {
        get => watermark;
        set => SetProperty(ref watermark, value);
    }
}