Я работаю над Silverlight 4 (существующее приложение) со следующим требованием:
краткое
Я понимаю, что здесь будет работать конвертер.
Я сделал некоторые из моих собственных поисков и нашел это:
Silverlight Привязка к обратному значению логической стоимости
Это отлично работало для отображения "Да" для 1 и "Нет" для 0.
Но у меня возникают проблемы с отправкой флажка True или False, которое делает обратное преобразование:
т.е. Он отправляет объекту следующее:
Проверено = 1 Не проверено = 0
Что я наделал:
+----+----------+--------+ | ID | USERNAME | ACTIVE | +----+----------+--------+ | | | | | 1 | John | 1 | | | | | | 2 | Jane | 0 | | | | | | 3 | Rick | 1 | | | | | | 4 | David | 0 | +----+----------+--------+
У меня есть следующий класс 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;
}
}
}
Мой 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>
SearchCriteria - наблюдаемый объект, который я использую для фильтрации
Если есть какие-либо проблемы с пространством имен, которые вы идентифицируете в XAML, это опечатка. Пожалуйста, проигнорируйте их. Моя основная проблема связана с фактическим преобразователем.
Спасибо
Реализация вашего конвертера неверна. Вы должны поменять местами применения методов 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;
}
}