Я пытаюсь создать элемент управления 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}" />
Я думаю, что я довольно близко. Что я делаю не так?