如何在XAML绑定中解决/控制属性名称冲突?

3

面试问题

问题描述:

如果出现属性名称冲突,您将如何在 XAML 绑定路径表达式中指定要绑定到的确切属性?

我迄今为止从未在任何绑定中遇到过此类(属性名称冲突)问题。通过一些阅读,我意识到,如果我绑定到一个已重写的属性,则可能会发生这种情况,因为就反射而言,我有两个此属性的实例(基类中的虚拟属性和派生类中的重写属性)。这是 XAML 使用的方式。

  • 是否还有其他情况可能导致 XAML 遇到属性名称冲突?
  • API 中是否有支持来处理/控制此问题?(而不是当然要避免冲突)

感谢您的关注。


他们可能在暗示将数据上下文绑定到显式接口实现 - default.kramer
2个回答

2

听起来对我来说完全是无意义的。除非他们想谈论绑定,使用像PriorityBindingMultiBinding这样“不连贯”的资源。

坦率地说,我认为覆盖属性不能涉及此事,因为这太超出范围了,您可以同样指出显式接口实现和许多其他明显不属于WPF领域的事情。


0
我能想到的最好方法是使用ValueConverter。但我认为这并不能真正回答问题,因为他们在绑定路径表达式中提出了问题,而我还没有看到这种可能性。我不是特别喜欢用这种方式,因为它感觉像是一个hack,但至少对于单向绑定来说是有效的。以下是您可能执行此操作的示例:
XAML:
<StackPanel Name="stack">
    <StackPanel.Resources>
        <loc:OverriddenMyPropertyConverter x:Key="BaseMyProperty"/>
    </StackPanel.Resources>
    <TextBox Text="{Binding Path=MyProperty}"/>
    <TextBox Text="{Binding Mode=OneWay, Converter={StaticResource BaseMyProperty}}"/>
</StackPanel>

StackPanel的DataContext是MyClass类的一个实例。第一个TextBox绑定到MyClass.MyProperty属性,第二个TextBox将绑定到MyBaseClass.MyProperty属性。双向绑定会更加复杂,因为实际上绑定到第二个TextBox的对象是MyClass对象而不是MyProperty对象。

代码:

class MyClass : MyBaseClass
{
    string myProperty = "overridden";
    public new string MyProperty
    {
        get { return myProperty; }
        set { myProperty = value; }
    }
}

class MyBaseClass
{
    string baseProperty = "base";
    public string MyProperty
    {
        get { return baseProperty; }
        set { baseProperty = value; }
    }
}

class OverriddenMyPropertyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (value as MyBaseClass).MyProperty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

使用转换器来完成这项任务毫无意义 - 必须通过在MV/M中创建属性来完成。基类可以潜在地驻留在单独的程序集中,UI不应该知道任何关于它的信息。 - user572559
@Dmitry - 当然,我同意这一点。但问题是如何实现。就像我在答案中所说的那样,我认为这种方法是一种欺骗,也就是不好的形式,但问题是如何实现,而不是是否应该这样做。 - Mark Synowiec
真的。我相信我们都在错误的方向上思考了:)一定是其他原因或故意设置的“错误”问题。 - user572559
是的。也许像你说的那样,完全是胡说八道,他们想要的答案是绑定路径表达式没有提供这样做的方法。我猜我会等待看看是否有人发布如何做到这一点的帖子! - Mark Synowiec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接