Свойство привязки к свойству зависимостей Silverlight независимо от DataContext - PullRequest
1 голос
/ 16 декабря 2009

Я пытаюсь создать элемент управления Address, обладающий свойством IsReadOnly, который будет делать каждую TextBox внутри только для чтения, если задано значение true.

 <my:AddressControl Grid.Column="1" Margin="5" IsReadOnly="True"/>

Мне удалось сделать это просто отлично с помощью свойства зависимости, и оно работает.

Вот простой класс с объявленным свойством зависимости:

public partial class AddressControl : UserControl
{
    public AddressControl()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    public static readonly DependencyProperty IsReadOnlyProperty = 
       DependencyProperty.Register("IsReadOnly", typeof(bool), 
                                   typeof(AddressControl), null);

    public bool IsReadOnly
    {
        get { return (bool)GetValue(IsReadOnlyProperty); }
        set { SetValue(IsReadOnlyProperty, value); }
    }
}

В XAML для этого файла кода есть Textbox для каждой адресной строки:

  <TextBox IsReadOnly="{Binding IsReadOnly}" Text="{Binding City, Mode=TwoWay}"/>
  <TextBox IsReadOnly="{Binding IsReadOnly}" Text="{Binding State, Mode=TwoWay}"/>
  <TextBox IsReadOnly="{Binding IsReadOnly}" Text="{Binding Zip, Mode=TwoWay}"/>

Как я и сказал, это прекрасно работает. Проблема в том, что сам элемент управления Address привязан к его родительскому объекту (у меня есть несколько адресов, которые я привязываю).

 <my:AddressControl DataContext="{Binding ShippingAddress, Mode=TwoWay}" IsReadOnly="True">
 <my:AddressControl DataContext="{Binding BillingAddress, Mode=TwoWay}" IsReadOnly="True">

Проблема в том, что как только я установил для DataContext значение, отличное от 'this', привязка для IsReadOnly обрывается. Не удивительно, потому что он ищет IsReadOnly в объекте данных Address и не существует и не принадлежит там.

Я пробовал почти каждую комбинацию атрибутов привязки , чтобы заставить IsReadOnly связываться с объектом AddressControl, но не могу заставить его работать.

Я пробовал подобные вещи, но не могу заставить IsReadOnly независимо связываться со свойством AddressControl вместо его DataContext.

<TextBox IsReadOnly="{Binding RelativeSource={RelativeSource Self}, Path=IsReadOnlyProperty}" Text="{Binding City, Mode=TwoWay}" />

Я думаю, что я довольно близко. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 27 марта 2010

С этим ответом (фактически мой собственный ответ на подобный вопрос) У меня есть хорошее [лучшее] решение.

Мне все еще нужно перебирать текстовые поля, но мне не нужно устанавливать фактическое значение. Я могу создавать привязки в коде позади - только не с XAML.

0 голосов
/ 18 декабря 2009

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

В отличие от некоторых людей, которые думают, что любой код, находящийся в файле с выделенным кодом, фактически признает ошибку, я не верю в это: если бросить какой-то код в выделенный код - это самый простой способ сделать что-то Вот где я положил свой код. Напротив, если мне придется потратить полдня, пытаясь выяснить, как сделать что-то с помощью привязки, что я мог бы сделать за пять минут с выделенным кодом, это ошибка , ИМО.

...