2009-12-16 3 views
1

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

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

+0

Играя с инструментом привязки для свойства «Текст», кажется, что «RelativeSource Self» на самом деле означает привязку к самому TextBox - это не то, что я хочу. Поэтому я думаю, что мне нужен FindAncestor, которого еще нет в Silverlight: -(Думаю, я застрял? Http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID = 480603 –

ответ

1

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

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

+0

Как раз сказать, что это правильный подход, а ошибочный ответ неправильный - это возможно, и вы не застреваете. – Quango

+0

ой, и я только понял, что это был мой вопрос, поэтому я могу изменить ответ. lol –

+0

что я думаю, что ken означает, что вы не можете сделать это только с привязками XAML - но, к счастью, его можно создать привязку в коде –

0

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

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

+0

если я застрял, я нашел - просто не хотел пропустить что-то. эти виды обучения помогут вам понять структуру намного лучше, даже если вы определенно потратите некоторое время на начальном этапе. определенно согласитесь с кодовым рядом вещей - см. мой пост здесь http://stackoverflow.com/questions/489415/how-to-get-a-codebehind-file-for-an-asp-net-mvc-view -in-rc1-to-be-created-by-de –

Смежные вопросы