我正在使用系统来表示数据。在其中我们使用实现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
答案 0 :(得分:1)
您的datacontext上不能有两个具有相同名称的属性。 如果你这样做,你会有一个反映歧义的编译错误。
请记住,您的来源是您的datacontext。
此外,数据绑定系统依赖源和路径来执行数据绑定。
答案 1 :(得分:1)
您不能隐式实现具有两个不同类型参数的通用接口。你必须至少做一个明确的。在这里,您可以看到您班级的示例实现。如您所见,您可以绑定到StringValue
和DoubleValue
:
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
时,您可以针对StringValue
或DoubleValue
提出该事件。
答案 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();