2012-02-13 6 views
0

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

Это то, что я уже пробовал:

У меня есть ViewModel, связанный для просмотра. Я переопределяю datacontext текстового поля в этом представлении, используя свойство модели представления. Это позволяет мне использовать общий стиль для моего текстового поля

У меня есть следующий стиль:

<Style x:Key="DateTimeTextBox" TargetType="TextBox"> 
    <Setter Property="ToolTipService.ShowDuration" Value ="40000"/> 
    <Setter Property="Text" Value ="{Binding Path=.,Converter={StaticResource myConverter},UpdateSourceTrigger=PropertyChanged}"/> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="true"> 
     <Setter Property="ToolTip" Value="Unknown date format"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

В представлении я хочу иметь следующее текстовое поле, связанное с porperty DateTimeValueToBind вместо всей точки зрения модель:

<TextBox Style="{StaticResource DateTimeTextBox}" DataContext="{Binding DateTimeValueToBind}"/> 

DateTimeValueToBind свойство отображается должным образом в текстовом поле, однако он не связан больше (когда я изменил его, ViewModel свойство не изменяется)

Я попытался добавить Mode = TwoWay в опции привязки, но ничего не изменил.

Не могли бы объяснить, почему свойство DateTimeValueToBind больше не связано в этом контексте?

Заранее спасибо

+0

Что вы имеете в виду, если «не привязан больше, свойство viewmodel не изменено»? Если вы изменяете DataContext, свойство CLR нужно поднять, иначе пользовательский интерфейс будет содержать ссылку на старый режим просмотра. Если вы правильно поднимете DataTimeValueToBind, он должен автоматически переделать свойство Text. Вы можете лучше понять, как работают ваши привязки, добавив PresentationTraceSources.TraceLevel = Высокий к вашим разметкам привязки. – dowhilefor

+0

@dowhilefor: я не изменяю экземпляр datacontext, я просто хочу делегировать привязку к текстовому полю, чтобы использовать некоторые общие параметры привязки в моем стиле (преобразователе данных) для этого контекста. я мог бы просто привязываться к атрибуту Text, но в этом случае мне всегда нужно будет указать конвертер, и я хочу, чтобы процесс конвертации был в стиле. – Guillaume

ответ

0

Оставьте DataContext, привязать к TextDateTimeValueToBind (переместить связывание с DataContext к Text). Вы никогда не должны устанавливать такую ​​привязку в стиле; если путь . вы не может связывать TwoWay. (И что вы в любом случае сохранили? У вас даже больше написано, поскольку "DataContext" длиннее "Text".)

+0

Я понимаю и то, что обычно делают, но в этом случае я не знаю, каким будет имя свойства. в моем приложении у меня есть много дат для отображения (разные имена свойств). Я хочу применить общую привязку, которая заставит использовать конкретный конвертер и всегда укажет его при привязке. Как я могу это сделать? – Guillaume

+0

@gbr: Вы можете создать привязку программно, как только узнаете, к чему привязаны. –

+0

в моем предыдущем комментарии. Мне нужно написать «Я хочу применить общую привязку, которая заставит использовать конкретный конвертер и ** NOT ** всегда указывать его при привязке». Чтобы сделать что-то коротким, я хочу «стилизовать» мои параметры привязки – Guillaume

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