c# - 如何从覆盖方法更新 WPF UI
问题描述
我正在尝试从 ViewModel 更新 WPF UI。
视图模型:
ConcreteObserver : Observer<Mouse>, INotifyPropertyChanged
{
private string _key;
public DelegateCommand TestDelegateCommand { get; set; }
public string Key
{
get { return _key; }
set { _key = value;
OnPropertyChanged(nameof(Key));
}
}
public ConcreteObserver ()
{
TestDelegateCommand = new DelegateCommand(UpdateGui);
}
private void UpdateGui()
{
Key = "Test refresh";
}
public override void Update(TestObject subject)
{
Key = "Test Update";
if (subject is TestObject)
{
subject.MouseAction += OnMouse;
subject.Start();
}
}
private void OnMouse(object sender, RowMouseDataEventArgs e)
{
Key += "1";
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
风景:
<UserControl.DataContext>
<local:ConcreteObserver />
</UserControl.DataContext>
<Grid>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding Key, UpdateSourceTrigger=PropertyChanged}" />
<Button
VerticalAlignment="Top"
HorizontalAlignment="Right"
Content="Click"
Command="{Binding TestDelegateCommand}" />
</Grid>
我有一个事件,当我单击鼠标时触发并且该事件工作正常。
Key
如果在方法中更改了 UI,则 UI 不会更新,并且如果属性更改Update
,则 GUI 上不会显示任何内容。Key
我设置了一个断点并观察了Key
属性的变化,一切正常,但 GUI 无法识别变化。
我用一个按钮对其进行了测试,单击按钮时会显示更改。
编辑:在这里我调用Update
方法(观察者模式):
public void NotifyObservers(T hookSubject)
{
if (hookSubject == null)
{
throw new ArgumentNullException($"{nameof(hookSubject)} cannot be null.");
}
foreach (var hookObserver in _hooksObservers)
{
hookObserver.UpdateHook(hookSubject);
}
}
在这里我称之为NotifyObservers
(在MouseHook类中)
public void NotifyObservers()
{
NotifyObservers(this);
}
有人可以向我解释为什么。
解决方案
您可能调用Update
了错误的对象。您正在 XAML ( <local:ConcreteObserver />
) 中实例化一个对象,所以我假设您没有在其他地方持有对它的引用,这意味着您可能更改了错误的Key
.
如果没有适当的示例,很难确定测试(如何Update
调用该方法的最少但完整的代码)
推荐阅读
- python - pandas asype("datetime64") 不一致且不引发
- amazon-web-services - 用于工作的 AWS 服务
- algorithm - 需要一种编程算法来围绕线段进行紧密封装
- python-3.x - Ajax 如何与动态 Django 下拉列表一起工作?不选择所选类别中的每个子类别
- reactjs - AWS - React Native - 注册、登录 - 在客户端和服务器端生成会话令牌
- function - 查找范围 [LR] 中的两个整数
- git - 如何标记要发布的分支?
- java - Java char 加法(char1 = char2 + 10)
- excel - 使用 Excel VBA 读取 SharePoint 列表 - ISAM 错误
- twilio - 在用户输入后,Twilio Gather 后接呼叫前转(拨号),而不使用另一个 webhook