INotifyPropertyChanged具有相同名称的属性

时间:2015-03-10 16:10:00

标签: c# wpf inotifypropertychanged

我正在使用系统来表示数据。在其中我们使用实现INotifyPropertyChanged的模板化接口。

public interface IScalar<T> : ISignal, INotifyPropertyChanged
{
    void Check(T value);

    /// <summary>
    /// Formats the specified value based on the item's formatting
    /// characteristics. Will throw an exception if the specified value
    /// could not be properly converted to the underlying type.
    /// </summary>
    /// <param name="value">Value to format.</param>
    /// <returns>Formatted value.</returns>
    string Format(T value);

    T Value { get; set; }
    string Units { get; set; }
}

我们有一个实现IScalar<double>IScalar<string>的类。有没有办法确保触发正确的PropertyChanged事件?它使用属性名称的字符串表示形式。由于我有两个同名的属性,我无法保证正确的事件将被解雇。我们希望WPF中的网格绑定到IScalar

列表

3 个答案:

答案 0 :(得分:1)

您的datacontext上不能有两个具有相同名称的属性。 如果你这样做,你会有一个反映歧义的编译错误。

请记住,您的来源是您的datacontext。

此外,数据绑定系统依赖路径来执行数据绑定。

答案 1 :(得分:1)

您不能隐式实现具有两个不同类型参数的通用接口。你必须至少做一个明确的。在这里,您可以看到您班级的示例实现。如您所见,您可以绑定到StringValueDoubleValue

public class Both : IScalar<string>, IScalar<double>
{
    public string StringValue { get; set; }

    string IScalar<string>.Value
    {
        get
        {
            return StringValue;
        }
        set
        {
            this.StringValue = value;
        }
    }

    public double DoubleValue { get; set; }

    double IScalar<double>.Value
    {
        get
        {
            return DoubleValue;
        }
        set
        {
            DoubleValue = value;
        }
    }

    // other methods and properties left out
}

当您需要加注PropertyChanged时,您可以针对StringValueDoubleValue提出该事件。

答案 2 :(得分:0)

除了Scott的正确答案之外,您可能还希望通过传入字符串来避免调用PropertyChanged方法。以下是您的表现方式:

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    var handler = PropertyChanged;
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}

现在,System.runtime.compilerservices程序集中的属性类CallerMemberName支持使用成员/方法名称的INPC。

您可以详细了解here

优点:   它允许您轻松地一次性建立基类,仅根据方法名称处理所有通知。 setter方法只有这行代码:

OnPropertyChanged();