Изменить формат привязки с помощью фокуса - PullRequest
0 голосов
/ 03 июня 2011

Приложение WPF с использованием MVVM. У меня есть TextBox, чье свойство Text связано со свойством decimal модели представления. Это свойство представляет значение валюты. Я бы хотел, чтобы TextBox отображал данные в валютном формате. Для этого я установил StringFormat в "c" в Binding. Это работает как ожидалось.

Проблема в том, что, если SourceUpdateTrigger равно PropertyChanged, когда пользователь начинает печатать, форматирование применяется после ввода первого символа, а курсор вставляется перед только что введенным символом. Это означает, что следующий символ будет введен перед первым, а не после. Если SourceUpdateTrigger равно LostFocus, то пользователь должен сместить фокус на другой элемент управления, прежде чем кнопка ОК будет включена, что происходит после проверки поля валюты.

Я надеялся обработать события GotFocus и LostFocus, получить ссылку на Binding и изменить его свойство StringFormat. У меня нет проблем с этим в отношении MVVM, потому что это чисто пользовательский интерфейс. Проблема в том, что возникло исключение, и мне сказали, что Binding не может быть изменен после использования.

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

У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 03 августа 2017

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

 <DataTemplate x:Key="DataTemplate1">
      <TextBox x:Name="TheTextBox"
               Text="{Binding Path=ThePropertyPath, StringFormat={}{0:p0}, UpdateSourceTrigger=PropertyChanged}" />
    <DataTemplate.Triggers>
       <!--  Set the TextBox.Text Binding but this time leave the StringFormat off -->
       <DataTrigger Binding="{Binding Path=IsKeyboardFocusWithin, ElementName=TheTextBox}" Value="True">
            <Setter TargetName="TheTextBox" Property="Text" Value="{Binding Path=ThePropertyPath, UpdateSourceTrigger=PropertyChanged}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=IsFocused, ElementName=TheTextBox}" Value="True">
            <Setter TargetName="TheTextBox" Property="Text" Value="{Binding Path=ThePropertyPath, UpdateSourceTrigger=PropertyChanged}" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>
0 голосов
/ 03 июня 2011

Как насчет того, чтобы оставить UpdateSourceTrigger на LostFocus и обработать TextChanged для вызова ValidateWithoutUpdate на привязке?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...