Я пытаюсь создать элемент управления Address
, который имеет свойство IsReadOnly
, которое будет делать каждый TextBox
внутри, только если установлено значение true.Свойство привязки для свойства зависимостей Silverlight, не зависящего от DataContext
<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
и он не существует и не существует.
Я пробовал практически любую комбинацию binding attributes, чтобы получить IsReadOnly
, чтобы привязать к AddressControl
obejct, но не может заставить его работать.
Я пробовал такие вещи, но я не могу получить IsReadOnly
, чтобы связать себя независимо от свойства AddressControl
вместо его DataContext
.
<TextBox IsReadOnly="{Binding RelativeSource={RelativeSource Self}, Path=IsReadOnlyProperty}" Text="{Binding City, Mode=TwoWay}" />
Я думаю, что я довольно близко. Что я делаю не так?
Играя с инструментом привязки для свойства «Текст», кажется, что «RelativeSource Self» на самом деле означает привязку к самому TextBox - это не то, что я хочу. Поэтому я думаю, что мне нужен FindAncestor, которого еще нет в Silverlight: -(Думаю, я застрял? Http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID = 480603 –