【问题标题】:c# accessor not called by referencec#访问器不是通过引用调用的
【发布时间】:2015-08-17 11:16:38
【问题描述】:

我的问题如下。我有一堂课:

public partial class GraphView : UserControl
{
    private ObservableChartDictionary _dictionary;
    public ObservableChartDictionary dictionary
    {
        get
        {
            return _dictionary;
        }
        set
        {
            this._dictionary = value;
            this.signals = ChartConverter(value);

        }
     }
 }

我稍后使这个属性等于另一个对象。

 myGraphView.dictionary = this.dictionary;

当我这样做时,我的属性的设置器运行良好。这也意味着

 this.signals = ChartConverter(value);

被执行。如果我更改引用的对象,“this.dictionary”的值会出现在“myGraphView.dictionary”中,但setter 不会执行,我的转换也不会发生。

我应该如何解决这个问题?我的 ObservableChartDictionary 类也实现了 INotifyPropertyChanged,但事件也没有在“myGraphView.dictionary”中引发。请帮忙!

【问题讨论】:

  • 更改字典中的内容不是setting 类的属性。如果您需要知道字典何时更改(以及何时更改字典),那么您无法使用简单的属性来做到这一点。

标签: c# properties reference inotifypropertychanged


【解决方案1】:

这可能是因为您正在以某种方式更改字典

this.dictionary.someproperty ... or this.dictionary.someMethod(...)

这样setter 属性就不会触发。它只是更改了字典的内容,而对它的其他引用会看到更改。

this.dictionary = 触发 set 属性的东西。

如果您想检测更改,此代码可能会有所帮助:

    public class ObservableChartDictionary<TKey, TValue> : Dictionary<TKey, TValue>, INotifyPropertyChanged
    {
        public void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        public TValue this[TKey key]
        {
            get { return this[key]; }
            set
            {
                base[key]= value;
                OnPropertyChanged(key.ToString());
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }

【讨论】:

  • 是的,这就是原因。但是如何强制 myGraphView.dictionary 识别更改?我尝试使用 INotifyPopertyChanged,但事件没有在 myGraphView.Dictionary 中触发。这是为什么呢?
  • 是的!谢谢!原来我仍然犯的错误是在分配对我的财产的引用之前注册 Porpertychanged 事件。这删除了我的订阅!
【解决方案2】:

observableDictionary 只是为 graphView 制作的,对吧?如果你想连接它们,你为什么不把你的 ObservableChartDictionary 实例链接到一个实际的图表视图..

public class ObservableChartDictionary
{
    public GraphView linkedGraph { get; set; }

    public ObservableChartDictionary(GraphView linkedGraph)
    {
        this.linkedGraph = linkedGraph;
    }

    //...      
}

然后您可以在字典更改时更新字典本身的值(例如,我的属性通知已更改):

        if (linkedGraph != null)
        {
             linkedGraph .signals = ChartConverter(this);
        }

因此,每次您添加条目或更改某些内容时,它都会更新图表。

您甚至可以创建一个嵌套类来显示它们之间的紧密联系。

【讨论】:

    猜你喜欢
    • 2020-06-30
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多