视图模型更改后 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
,它实现了 INotifyPropertyChanged
和 INotifyPropertyChanging
。
我有以下 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);
}
}
我有以下视图模型:
public class ViewModel : ObservableObject
{
public string Watermark { get; set; } = "Loading...";
}
其中 ObservableObject
来自 Microsoft.Toolkit.Mvvm.ComponentModel
,它实现了 INotifyPropertyChanged
和 INotifyPropertyChanging
。
我有以下 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);
}
}