首页 > 解决方案 > 如何从覆盖方法更新 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);
        }

有人可以向我解释为什么。

标签: c#wpf

解决方案


您可能调用Update了错误的对象。您正在 XAML ( <local:ConcreteObserver />) 中实例化一个对象,所以我假设您没有在其他地方持有对它的引用,这意味着您可能更改了错误的Key.

如果没有适当的示例,很难确定测试(如何Update调用该方法的最少但完整的代码)


推荐阅读