2014-11-13 5 views
1

Я ищу причину, почему мой код не выполняет свою работу: В XAML я использую:C# XAML Связывание по умолчанию с IValueConverter

<TextBox Text="{Binding Path=Txt_8, Converter={StaticResource DefKonverter}, ConverterParameter='UserAlias'}"/> 

В C# есть являются IValueConverter, который дает мне значение по умолчанию, когда ConverterParameter = 'UserAlias'. Напр. строка «Jettero». Это хорошо работает для этого момента, я вижу в своем TextBox текст «Jettero». Я сохраняю свою запись в базе данных, но в записи Txt_8 все еще NULL! (Другие поля хорошо сохраняются) Похоже, что привязка не обновляет поле записи за TextBox.

=========== Update начать

Заключение: Это не работает, потому что Binding работает в одном направлении. Конвертер хорош для показа особых вещей, что делает ваш пользователь опыт лучше, но не для его сохранения.

=========== конец Обновление

Аналогичная проблема в обратном направлении происходит также, в XAML:

<TextBox Text="{Binding Path=Date_1, Converter={StaticResource DefKonverter}, ConverterParameter='\{0:yyyy-MM-dd\}TimeStamp'}"/> 

Это работает как должно в записи за: когда Я пишу в TextBox «.». символ «переводится» на сегодняшнюю дату. После сохранения записи она содержит дату. Но в TextBox я все еще вижу написанное «.». В этом сидите Binding, не обновляя TextBox над записью.

=========== Update начать

Заключение: Это не работает хорошо, потому что Binding работает в одном направлении. Конвертер хорош для изменения данных в этой форме, как вы хотите сохранить.

Что еще не ответил: когда я конвертирую '.' в настоящее время он не показывает, что теперь я вижу причину. НО в конвертере, если я использую Модальное окно, чтобы каким-то образом расширить данные, которые я написал (найти полный текст для ключевого слова), эта расширенная информация SHOWS UP в моем TextBox рядом с ее сохранением.

=========== конец Обновление

Я не знаю, что я не скучаю ... Я проверил много использования решений по умолчанию и IValueConverter, но это просто сидеть и не подошел. Может ли кто-нибудь помочь?

+0

Во время отладки, откройте окно вывода (View -> Output, Ctrl + Alt + O) и поиск Binding ошибок , Если они есть, вставьте их здесь. Это даст нам больше информации. – Fka

+0

Очень хорошая идея! У меня один тип привязки: Ошибка System.Windows.Data: 40: Ошибка пути BindingExpression: свойство IsExpanded не найдено в 'object' '' RTFBox '(Name =' FeladatRTFdoboz ')'. BindingExpression: Path = IsExpanded; DataItem = 'RTFBox' (Name = 'FeladatRTFdoboz'); целевой элемент - «GridSplitter» (Name = ''); target свойство «Видимость» (тип «Видимость») , но это не связано с моей проблемой. – Jettero

ответ

2

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

При рендеринге текстового поля привязка считывает значение, скажем null, из вашего свойства Txt_8 передает это преобразование, которое дает ему значение для рендеринга в вашем примере «Jettero». Это означает, что визуальное представление вашего null - Jettero. Это не означает, что (и не будет), следовательно, заменит ваш null на «Jettero», потому что, согласно механизму привязки, он успешно загрузил значение из источника и вернул его цели.

Метод конвертера значений предназначен для сценария, в котором значение изменяется в пользовательском интерфейсе, и его необходимо преобразовать обратно для хранения.

Мораль истории: не используйте конвертер значений для указания значения по умолчанию для привязки. Если вашему свойству требуется значение по умолчанию, назначьте его в свой конструктор или инициализатор. Если вы хотите, чтобы ваше значение свойства изменилось, так как ему присвоено значение, внесите его там, а не в конвертер.

Например, вы можете определить свойство Date, как это вместо того, чтобы использовать конвертер:

// disclaimer: untested pseudo-code 
private DateTime? _dateTimeField; 

public string SomeDateProperty 
{ 
    get { return _dateTimeField.ToString('dd-MM-yyyy'); } 
    set 
    { 
     if (value == '.') 
     value = DateTime.Today.ToString(); 

     _dateTimeField = DateTime.Parse(value); 
    } 
} 
+0

Я не могу использовать функцию C#, потому что XAML загружается моей программой и используется как ListView DataTemplate. – Jettero

+0

Я видел, ты имеешь в виду. Я попробовал в привязке «TargetNullValue =« Jettero »как тест с похожим результатом: показательно красиво, но не сэкономить. Я думаю, что это должно дать привязанную ценность, но нет. Я не могу использовать вызов функции C#, потому что XAML загружается моей программой и используется как ListView DataTemplate. Я могу использовать через StaticResouce и в функции Binding. Как я могу реализовать этот код в своем XAML? – Jettero

+0

В одном и том же IValueConverter есть что-то, что противоречит части ConvertBack вашего ответа: Когда я пишу в связанной с String части TextBox моего имени партнера, он возвращает полное имя - и это работает хорошо! Может ли быть разница в обработке строк и даты? – Jettero

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