C# InotifyProperty通过间接层进行更改

C# InotifyProperty通过间接层进行更改,c#,inotifypropertychanged,indirection,C#,Inotifypropertychanged,Indirection,这可能是一个X-Y问题。如果我在这里完全偏离了基准,请不要犹豫告诉我 首先,我想到的是一个简单的例子 using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace XXXX

这可能是一个X-Y问题。如果我在这里完全偏离了基准,请不要犹豫告诉我

首先,我想到的是一个简单的例子

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;

namespace XXXXXXX
{
    public class AbstractOperation : INotifyPropertyChanged
    {
        public enum OpState { Init, Running, Aborted, Completed, Errored };
        OpState privateOperationState;
        public OpState OperationState
        {
            get => privateOperationState;
            private set
            {
                if(privateOperationState!=value)
                {
                    privateOperationState = value;
                    OnPropertyChanged();
                }
            }
        }

        public bool IsRunning => OperationState == OpState.Running;

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

    public class BackgroundOperator
    {
        AbstractOperation whatever;

        public bool IsRunning => whatever.IsRunning;
        public AbstractOperation.OpState OperationState => whatever.OperationState;
    }

}
AbstractOperation是一个基类,表示一些需要花费大量时间执行的多步骤操作。它将通过一些属性公开其操作的状态

BackgroundOperation是一个类,它将接受一个抽象操作并在后台线程中运行它,传递一些状态属性。我希望能够将一些UI元素属性绑定到这些操作,以便在操作运行时禁用某个控件。我知道INotifyPropertyChanged接口对于这样的绑定工作是必要的

如果我只在一个属性上实现PropertyChange事件,那么通知是否会自动覆盖其主体中引用此属性的其他属性?它是否只在类内工作,还是仍然与拥有通知类实例的另一个类一起工作?我是否需要执行一些特殊代码来将引用的属性链接到原始属性的通知?还是我深入到了X-Y领域,应该实现一些其他方式将UI控件绑定到我的操作状态

如果我只在一个属性上实现PropertyChange事件,那么通知是否会自动覆盖其主体中引用此属性的其他属性

你试的时候发生了什么?您是否收到其他酒店的酒店变更通知

它是否只在类内工作,还是仍然与拥有通知类实例的另一个类一起工作

它一点也不这样做,所以它在任何其他类中都不会这样做

属性更改通知并不神奇。它只是引发事件,将event args对象中的name值设置为传递给
OnPropertyChanged()
方法的值(在本例中,通过
[CallerMemberName]
属性隐式传递)

尽管如此,使用这样的属性并不一定是处理禁用命令的最佳方法。您没有说明实际使用的API是什么,但使用这种模式的常见API是WPF。它对命令使用
ICommand
绑定。应使用
ICommand.CanExecute()
方法指示命令在给定时间是否有效
ICommand.CanExecuteChanged
应在该方法的值更改时升高。这通常是通过任何代码开始操作或更改某些状态来完成的,这些状态会导致命令在当时无效。完成后,相同的代码会将
CanExecute()
状态更改回有效状态

更改命令状态和引发其事件的确切机制取决于如何实现命令。有很多例子,你应该回顾一下。看看什么最适合你


如果您使用的是其他API,那么它可能有也可能没有类似的机制。我们不可能知道最好的答案是什么,因为您的问题中没有这些信息。

很抱歉没有提及,这是一个WPF项目。就测试而言,我仍在学习这些事件和接口中有多少起作用,因此我不完全相信自己A)正确地进行测试,或者B)正确地解释结果。听起来属性通知就像我担心的那样有限。作为一个WPF项目,你认为ICommand CanExecute更好吗?你能链接到一个如何按照你建议的方式实现它的示例吗?我还应该提到,我想启用/禁用的不仅仅是命令,还有UI控件本身。例如,当其中一个操作正在运行时,我希望使用的LitsView变灰(取消缩放),然后在操作完成后重新启用。@标记:“您认为ICommand CanExecute更好吗?”--是。“你能链接到如何按照你建议的方式实现它的示例吗?”--不太可能。我对具体样品没有任何第一手资料。网络搜索将是一个很好的开始。“我要启用/禁用的不仅仅是命令,而是UI控件本身”——对于不自动执行此操作的控件(按钮、菜单项等),您可以订阅命令的
CanExecuteChanged
,并手动处理启用/禁用状态更改。