Как разрешить / контролировать конфликт свойств в привязке XAML? - PullRequest
3 голосов
/ 24 января 2012

Вопрос для интервью

Сформулировано как:

Если вы столкнулись с именем свойства, как бы вы указали точное свойство для привязки в привязке?выражение пути (в XAML)?

До сих пор я никогда не сталкивался с этой проблемой (коллизия имени свойства) ни в одной привязке.С некоторым чтением я понял, что это возможно в случае, если я привязываюсь к переопределенному свойству, потому что тогда у меня есть два экземпляра этого свойства (виртуальное в базе и переопределенное в производном), что касается разрешения с использованием Reflection.Именно это и используется XAML.

  • Может ли быть другой случай, когда XAML может столкнуться с коллизией имени свойства?
  • Есть ли некоторая поддержка в API для обработки / контроля этого?(Вместо того, чтобы избежать столкновения)

Спасибо за проявленный интерес.

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Звучит как полная чушь для меня. Если они не хотели говорить о привязках, используя «разрозненные» источники, такие как PriorityBinding и MultiBinding.

Честно говоря, я не думаю, что в дело могут быть вовлечены перезаписанные свойства, поскольку это настолько выходит за рамки, что вы могли бы также указать на явные реализации интерфейса и многие другие вещи, которые явно находятся за пределами домена WPF.

0 голосов
/ 24 января 2012

Лучший способ, который я могу себе представить, это использовать ValueConverter. Я не думаю, что это действительно отвечает на вопрос, так как они спрашивают в выражении связывания пути, которое я не видел возможным. Я не особенно люблю делать это таким образом, потому что это похоже на хак, но это работает по крайней мере для одностороннего связывания. Вот пример того, как вы можете это сделать:

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>

DataContext из StackPanel является экземпляром 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...