Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# InotifyProperty已更改为具有相同名称的属性_C#_Wpf_Inotifypropertychanged - Fatal编程技术网

C# InotifyProperty已更改为具有相同名称的属性

C# InotifyProperty已更改为具有相同名称的属性,c#,wpf,inotifypropertychanged,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

我正在研究一个表示数据的系统。在其中,我们使用了一个模板化接口,该接口实现了
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:ISignal,INotifyPropertyChanged
{
无效检查(T值);
/// 
///根据项的格式设置指定值的格式
///如果指定的值无效,将引发异常
///无法正确转换为基础类型。
/// 
///要格式化的值。
///格式化值。
字符串格式(T值);
T值{get;set;}
字符串单位{get;set;}
}

我们最终拥有了一个实现
IScalar
IScalar
的类。有没有办法确保触发了正确的PropertyChanged事件?它使用属性名称的字符串表示形式。由于我有两个同名的属性,我不能保证会触发正确的事件。我们希望WPF中的网格绑定到IScalar列表

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

请记住,源是您的数据上下文


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

您不能隐式实现具有两个不同类型参数的通用接口。你必须至少做出一个明确的决定。在这里,您可以看到类的示例实现。如您所见,您可以绑定到
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
}
公共类两者:IScalar,IScalar
{
公共字符串StringValue{get;set;}
字符串IScalar.Value
{
得到
{
返回字符串值;
}
设置
{
this.StringValue=value;
}
}
公共双双精度值{get;set;}
双IScalar值
{
得到
{
返回双值;
}
设置
{
双重价值=价值;
}
}
//遗漏的其他方法和属性
}

当您需要引发
PropertyChanged
时,您可以为
StringValue
DoubleValue

引发该事件。除了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

你可以阅读更多关于它的内容

优点: 它允许您轻松地一次性建立一个基类,该基类仅基于方法名处理所有通知。setter方法只有以下代码行:

OnPropertyChanged();    

它是如何实现的?您能否只绑定到IScalar,并使用该值转换器将WPF在绑定时拥有的任何东西转换为字符串?您确定要触发的事件是正确的还是错误的?由于
INotifyPropertyChanged
有点过于简单,我假设如果为属性名称
Value
触发
PropertyChanged
事件,系统类通常会假定两个属性都已更改。现在,如果您确实需要知道哪一个属性发生了更改,那么
INotifyPropertyChanged
可能会非常棘手。我将绑定到的并非所有内容都是IScalar,但它们都是IScalarit,它将触发两个属性的更新,因为它无法区分它们。你得到的只是名字。然而,更有趣的是如何绑定到同名的两个属性。这听起来像是一个不可能的构造这可能应该是一个注释,因为这不是要求的,我甚至不完全相信如果绑定是在代码隐藏中创建的话这是真的。事实上,这表明这是可能的。你怎么能在一个类上有两个相同的属性名,而不管它是代码隐藏还是视图模型?最终,它仍然是一个充当源的类(又名:DataContext)。“当需要引发PropertyChanged时,可以为StringValue或DoubleValue引发该事件。”-问题不正是如何为一个或另一个做到这一点吗?@O.R.Mapper:我想OP很担心,因为有两个
Value
s。但是我的代码中没有。我无法绑定DoubleValue和StringValue,绑定的项将是
IScalar
的列表,那么您应该能够绑定到value,因为这是显式属性名。通过WPF进行绑定是否会自动处理同名的不同属性?例如,如果我更改了
IScalar.Value
,事件是否仍会被网格触发并忽略,因为它正在查看
IScalar
?不幸的是,Microsoft关于INOTIFYPROPERTYCHANGED actual在内部做什么的文档充其量也很差。但是,我们知道,如果两个属性的类型不同,则允许它们具有相同的名称。我相信您会没事的,因为类型将是任何完全限定属性名称的一部分。如果我们查看依赖属性,那么如果没有类型参数,就无法定义它们。对你们来说,最好的办法是进行实验,看看你们是否能做到这一点。