Конвертер байтов в логическое значение (флажок)

1

Я работаю над Silverlight 4 (существующее приложение) со следующим требованием:

краткое

  1. Должен иметь вид поиска, где есть флажок, чтобы определить, должен ли он возвращать записи в соответствии с флагом 1 или 0, хранящимся в определенном столбце
  2. Бэкэнд-часть работает нормально (получение данных из службы WCF)
  3. Проблема, с которой я сталкиваюсь, заключается в преобразовании значения Boolean Checkbox из front-end в значение Byte (1 или 0), отправленного на вызов WCF, который подменяет данные

Я понимаю, что здесь будет работать конвертер.

Я сделал некоторые из моих собственных поисков и нашел это:

Silverlight Привязка к обратному значению логической стоимости

Это отлично работало для отображения "Да" для 1 и "Нет" для 0.

Но у меня возникают проблемы с отправкой флажка True или False, которое делает обратное преобразование:

т.е. Он отправляет объекту следующее:

Проверено = 1 Не проверено = 0

Что я наделал:

  1. В качестве примера у меня есть таблица с данными пользователя следующим образом:
+----+----------+--------+
| ID | USERNAME | ACTIVE |
+----+----------+--------+
|    |          |        |
| 1  | John     | 1      |
|    |          |        |
| 2  | Jane     | 0      |
|    |          |        |
| 3  | Rick     | 1      |
|    |          |        |
| 4  | David    | 0      |
+----+----------+--------+
  1. У меня есть следующий класс Convertor:

    namespace MyApplication.Silverlight.Converters {

    public class BoolToByteConverter : IValueConverter
    {
        public int FalseValue { get; set; }
        public int TrueValue { get; set; }
    
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return FalseValue;
            else
                return (bool)value ? TrueValue : FalseValue;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value != null ? value.Equals(TrueValue) : false;
        }
    }
    

    }

  2. Мой XAML

Объявление пространства имен

Xmlns: преобразователи = "CLR-имена: MyApplication.Silverlight.Converters; сборка = MyApplication.Silverlight"
mc: Ignorable = "d" d: DesignHeight = "140" d: DesignWidth = "800">

Объявление ресурса

<UserControl.Resources>
            <converters:BoolToByteConverter x:Key="COneZero" FalseValue="0" TrueValue="1" />
        </UserControl.Resources>

Поиск по полю

<Grid x:Name="LayoutRoot">
        <StackPanel Orientation="Vertical">
            <Grid x:Name="UserSearchGrid">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="140" />
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <dataInput:Label x:Name="lblName" Grid.Row="0" Grid.Column="0" Content="Name:" Margin="2" />
                <!--Some Other search fields-->
                <CheckBox x:Name="chkIncludeInActiveUsers"
                          Grid.Row="4"
                          Grid.Column="3"
                          Grid.ColumnSpan="3"
                          VerticalAlignment="Center"
                          Content="Include InActive Users"
                          IsChecked="{Binding SearchCriteria.ActiveStatus, Converter={StaticResource COneZero}, Mode=TwoWay}"
                          Margin="21,4,99,4" />
            </Grid>
        </StackPanel>
    </Grid>
</UserControl>
  1. SearchCriteria - наблюдаемый объект, который я использую для фильтрации

  2. Если есть какие-либо проблемы с пространством имен, которые вы идентифицируете в XAML, это опечатка. Пожалуйста, проигнорируйте их. Моя основная проблема связана с фактическим преобразователем.

Спасибо

Теги:
ivalueconverter
checkbox
silverlight

1 ответ

2
Лучший ответ

Реализация вашего конвертера неверна. Вы должны поменять местами применения методов Convert и ConvertBack.

Метод Convert преобразует значение из вашего ViewModel в значение для метода View и ConvertBack преобразуя значение из представления в значение ViewModel.

Таким образом, в вашем случае с использованием конвертера в IsChecked -Property CheckBox метод Convert получает значение Byte и преобразуется в логическое, тогда как метод ConvertBack получает логическое значение и преобразует его в байт.

public class BoolToByteConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null)
            return false;
        else
            return System.Convert.ToBoolean(value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value != null ? System.Convert.ToByte(value) : 0;
    }
}
  • 0
    Привет @Jehof, извините за поздний ответ. Это сделал это. Отмечается как ответ. Редактировать: Добавлена полная квалификация вызовов преобразования системных типов (с префиксом «System.»), Так как это путает компилятор с внутренним методом Convert ... и выдает «Namespace.Convert (object, System.Type, object, System.Globalization). .CultureInfo) '- это метод, который недопустим в данном контексте.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню