【问题标题】:Converter for Byte to Boolean (Checkbox)字节到布尔值的转换器(复选框)
【发布时间】:2025-12-30 13:45:12
【问题描述】:

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

简介

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

我知道这是转换器可以工作的地方。

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

Silverlight Bind to inverse of boolean property value

这非常适合在 1 中显示“是”,在 0 中显示“否”。

但我在发送复选框 True 或 False 值时遇到问题:

即它发送给对象如下:

选中 = 1 未检查 = 0

我做了什么:

  1. 例如,我有一个用户详细信息表,如下所示:
+----+----------+--------+ |身份证 |用户名 |活跃 | +----+----------+--------+ | | | | | 1 |约翰 | 1 | | | | | | 2 |简 | 0 | | | | | | 3 |瑞克 | 1 | | | | | | 4 |大卫 | 0 | +----+----------+--------+
  1. 我有以下 Convertor 类:

    命名空间 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:converters="clr-namespace:MyApplication.Silverlight.Converters;assembly=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>
  1. SearchCriteria 是我用来执行过滤的可观察对象

  2. 如果您在 XAML 中发现任何命名空间问题,那是一个错字。请忽略它们。我的主要问题是实际转换器。

谢谢

【问题讨论】:

    标签: c# silverlight checkbox ivalueconverter


    【解决方案1】:

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

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

    因此,在您在 CheckBox 的 IsChecked-Property 的绑定中使用转换器的情况下,Convert 方法获取一个字节值并将 is 转换为布尔值,而 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;
        }
    }
    

    【讨论】:

    • 嗨@Jehof,很抱歉回复晚了。做到了。标记为答案。编辑:添加了系统类型转换调用的完整限定(以“System.”为前缀),因为它将编译器与内部 Convert 方法混淆......并抛出“Namespace.Convert(object, System.Type, object, System.Globalization .CultureInfo)' 是一个“方法”,在给定的上下文中无效”
    最近更新 更多