2013-03-12 2 views
6

Как использовать IValueConverter для преобразования нулей в булев?Null To Boolean IValueConverter не работает

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

Я попытался создать конвертер NullToBoolean, который принимает нулевые значения из базы данных и отображает их как false, , а затем сохраняет их как ложные, когда пользователь нажимает save. (По сути, я стараюсь, чтобы пользователь не дважды щелкнул флажками (один раз, чтобы сделать его истинным, а затем сделать его ложным). Это, похоже, работает на импорт, то есть нулевые значения отображаются как ложные, но если Я делаю два щелчок потанцевать значение не изменяется в базе данных при сохранении

Мой конвертер:.

[ValueConversion(typeof(bool), typeof(bool))] 
public class NullBooleanConverter : IValueConverter 
{ 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    if (value != null) 
    { 
     return value; 
    } 
    return false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    if (value != null) 
    { 
     return value; 
    } 
    return null; 
    } 
} 

Один из флажков я пытаюсь иметь конвертер работать с:

<CheckBox Grid.Column="1" Grid.Row="0" Padding="5" Margin="5" VerticalAlignment="Center" Name="chkVarianceDescriptionProvided" IsThreeState="False"> 
     <CheckBox.IsChecked> 
     <Binding Path="VarianceDescriptionProvided" Mode="TwoWay"> 
      <Binding.Converter> 
      <utils:NullBooleanConverter /> 
      </Binding.Converter> 
     </Binding> 
     </CheckBox.IsChecked> 
    </CheckBox> 

Я не знаю, является ли проблема, потому что мой код неправильный или если это случай конвертера, думая, что ничего не изменилось, поэтому ему не нужно ConvertBack. Я пробовал все Mode s и переключил код в Convert с ConvertBack, но ничего не работает.

Может кто-нибудь указать, что мне нужно сделать, чтобы исправить это?

+1

Человек, который выглядит уродливым. Вы преобразовываете Null в false и not-null в true? Потому что ты этого не делаешь. и при обратном обращении вы конвертируете bool (который никогда не будет null) обратно в bool. –

+1

Вы проверили, ударил ли ваш код конвертера? –

+3

Кстати, «Когда создается новая запись, эти значения равны нулю ...«Проблема заключается в том, что вы должны делать« View Friendly »ViewModels/DataModels. –

ответ

1

Реальная проблема заключается в том, что вы не инициализируете свои объекты данных в первую очередь. Не «исправляйте», делайте это правильно для начала; строители хороши (например). Вы также должны создавать ViewModels/DataModels, а не напрямую работать с вашими моделями (база данных и т. Д.).

public class MyObjectBuilder 
{ 
    Checked _checked; 

    public MyObjectBuilder() 
    { 
      Reset() 
    } 

    private void Reset() 
    { 
      _checked = new Checked(true); //etc 
    } 

    public MyObjectBuilder WithChecked(bool checked) 
    { 
      _checked = new Checked(checked); 
    } 

    public MyObject Build() 
    { 
     var built = new MyObject(){Checked = _checked;} 
     Reset(); 
     return built; 
    } 
} 

затем всегда инициализируется с застройщиком

myObjects.Add(new MyObjectBuilder().Build()); 

или

myObjects.Add(_injectedBuilder.Build()); // Initialises Checked to default 
myObjects.Add(_injectedBuilder.WithChecked(true).Build()); //True 

Хотя это не исправить вашу проблему спросил, это будет исправить вашу основную проблему таким образом, вы можете Unit Контрольная работа. т. е. вы можете проверить, чтобы значения, добавленные в список объектов, всегда инициализировались.

+0

Спасибо @ Meirion-Hughes. Я понимаю, что вы имеете в виду, и можете следовать вашим идеям, чтобы добраться туда, где я хочу быть. По умолчанию в построении объекта - на нем. Я не знал о mvvm, когда я начинал с этого, так что в настоящее время wpf делает old-skool (обработчики событий, бит спагетти, проверку данных и т. Д. В коде) с добавленными функциями mvvm, когда я узнаю, как их вставить Стремясь сделать мой следующий проект полностью mvvm, но нужно работать через текущий гибрид, я уже начал этот. Еще раз спасибо – mcalex

+0

Google, * Caliburn Micro *. Это потрясающе. –

+0

Я исследовал несколько рамок. К сожалению, ни один из них не детализирует, как превращать спагетти в mvvm. Caliburn, безусловно, выглядит довольно впечатляюще, и, возможно, я начинаю новый проект. Cheers – mcalex

0

Просто исправьте свои данные до вы выполняете привязку данных. Это единственный вариант. Конвертер будет работать только в том случае, если флажок установлен как «непроверенный» и обновляет ваши данные только при взаимодействии с элементом управления. Например:

foreach (var item in items) 
{ 
    if (item.VarianceDescriptionProvided == null) 
     item.VarianceDescriptionProvided = false; 
} 
+0

Не получится, если у вас есть элементы, добавленные в произвольные моменты времени, вам нужно будет добавить наблюдаемый список, послушать его и исправить добавленный новый элемент вам. могут также просто убедиться, что они правильны, когда вы их делаете. –

+0

Просто запустите этот код каждый раз, когда вы получаете результат от EF. Нет необходимости в сложных упаковках и таких –

13

Хм, зачем использовать конвертер, если вы можете его получить из коробки?

<CheckBox IsChecked="{Binding VarianceDescriptionProvided, TargetNullValue=False}" /> 

Для получения дополнительной информации, пожалуйста, смотрите here.

+0

Я не знал о TargetNullValue, большое спасибо. Однако это не сохраняет значения «False» обратно в базу данных (т. Е. Они остаются NULL после сохранения). Он выполняет ту же работу, что и в настоящее время в конвертере, поэтому я буду использовать это вместо того, чтобы исправить мою большую проблему. – mcalex

+0

Хорошо, это была просто попытка. Я не был уверен, если значение передано VM. Спасибо, что сообщили мне. :) – DHN

+0

Интересно, потому что doco: (http://msdn.microsoft.com/en-us/library/system.windows.data.bindingbase.targetnullvalue.aspx) говорит, что это геттер и сеттер, - но тогда doesn Приведем пример настройки. – mcalex