字节到布尔值的转换器(复选框)

本文关键字:复选框 转换器 布尔值 字节 | 更新日期: 2023-09-27 18:04:05

我正在Silverlight 4(现有应用程序)上工作,具有以下要求:

短暂

  1. 应该有一个搜索视图,其中有一个复选框,以确定是否应该根据存储在某列中的1或0标志返回记录
  2. 后端部分工作正常(从WCF服务检索数据)
  3. 我的问题是转换布尔复选框值从前端到字节值(1或0)发送到WCF调用,填充数据

我明白这是转换器工作的地方。

我自己做了一些搜索,发现了这个:

Silverlight绑定布尔属性值的逆

这对于显示"Yes"为1和"No"为0非常有效。

但是我在发送一个复选框True或False值时遇到了问题,它会进行反向转换:

。e向对象发送如下信息:

Checked = 1未检查= 0

我做了什么:

  1. 作为示例,我有一个包含用户详细信息的表,如下所示:
<>之前+----+----------+--------+| id | username | active |+----+----------+--------+| | | |约翰;约翰| | | || 2 |简| 0 || | | |[3]瑞克[1]| | | || 4 |大卫| 0 |+----+----------+--------+之前
  1. 我有以下转换器类:

    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. 我的<<li>

    strong> XAML

名称空间声明

xmlns:转换器= " clr-namespace: MyApplication.Silverlight.Converters;装配= MyApplication.Silverlight "
主持人:可忽略的= " 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中发现了任何名称空间问题,那就是拼写错误。请忽略他们。我的主要问题是实际的转换器。

  • 感谢

    字节到布尔值的转换器(复选框)

    您的转换器的实现不正确。您必须交换ConvertConvertBack方法的实现。

    Convert方法将ViewModel中的值转换为View的值,ConvertBack方法将View中的值转换为ViewModel的值。

    所以在你的情况下,使用转换器在IsChecked -属性的复选框的绑定Convert方法获得一个字节值并转换为布尔值,而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;
        }
    }