none
值和比特位的Binding Converter RRS feed

  • 问题

  • 如题,本人想解决这么一个问题:

    通过一个byte类型的值,知道他每一个bit的值

    修改bit位的值,可以得到这个byte类型的值

    要求双向绑定。

    2019年11月15日 1:59

全部回复

  • Hi,

     <Window.Resources>
            <local:DepartmentValueConverter x:Key="DeptConverter"/>
        </Window.Resources>
        <StackPanel x:Name="DepartmentsPanel" >
            <CheckBox Content="A"
                  IsChecked="{Binding  Path=Department, Converter={StaticResource DeptConverter}, ConverterParameter={x:Static local:Department.B }}"/>
           
        </StackPanel>
    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace _1.Test
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                this.DepartmentsPanel.DataContext = new DataObject
                {
                    Department = Department.A | Department.C
                };
            }
        }
    
    
        [Flags]
        public  enum Department:byte
        {
            None = 0x00,
            A = 0x01,
            B = 0x02,
            C = 0x04,
            D = 0x08
        }
    
     
        public  class DataObject
        {
            public DataObject()
            {
            }
    
            public Department Department { get; set; }
        }
    
    
        public class DepartmentValueConverter : IValueConverter
        {
            private Department target;
    
            public DepartmentValueConverter()
            {
            }
    
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                Department mask = (Department)parameter;
                this.target = (Department)value;
                return ((mask & this.target) != 0);
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                this.target ^= (Department)parameter;
                return this.target;
            }
        }
    
    
    }

    Best Regards,

    Alex


    如果您对Visual Studio 或Microsoft Azure相关产品感兴趣,请点击此链接,或扫描以下二维码注册获取相关信息。







    2019年11月16日 5:05
    版主
  • hi,Alex

    如果这个Converter在多处有使用到呢?

    那么会有多个target还是共用一个target?

    我做了验证好像是同一个target。

    public class MyConverter2 : IValueConverter
        {
            private byte target;
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                byte start = System.Convert.ToByte(parameter.ToString().Split('-')[0]);
                byte end = System.Convert.ToByte(parameter.ToString().Split('-')[1]);
    
                byte val = (byte)value;
                this.target = val;
                return ((val >> start) & 0x01) == 1;
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                byte start = System.Convert.ToByte(parameter.ToString().Split('-')[0]);
                byte end = System.Convert.ToByte(parameter.ToString().Split('-')[1]);
    
                byte mask = 0x01;
                mask <<= start;
                if ((bool)value == true)
                    this.target |= mask;
                else
                    this.target &= (byte)(~mask);
                return this.target;
            }
        }
    <Grid x:Name="MyTextBlock">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <StackPanel Grid.Row="0"  Orientation="Horizontal">
                <TextBox  Text="{Binding Path=Number1,Converter={StaticResource sResource1}}" HorizontalAlignment="Left" TextWrapping="Wrap"/>
                <CheckBox IsChecked="{Binding Path=Number1,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=7-7}"/>
                <CheckBox IsChecked="{Binding Path=Number1,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=6-6}" />
                <CheckBox IsChecked="{Binding Path=Number1,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=5-5}" />
                <CheckBox IsChecked="{Binding Path=Number1,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=4-4}" />
                <CheckBox IsChecked="{Binding Path=Number1,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=3-3}" />
                <CheckBox IsChecked="{Binding Path=Number1,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=2-2}"/>
                <CheckBox IsChecked="{Binding Path=Number1,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=1-1}" />
                <CheckBox IsChecked="{Binding Path=Number1,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=0-0}" />
            </StackPanel>
            <StackPanel Grid.Row="1" Orientation="Horizontal">
                <TextBox  Text="{Binding Path=Number2,Converter={StaticResource sResource1}}" HorizontalAlignment="Left" TextWrapping="Wrap"/>
                <CheckBox IsChecked="{Binding Path=Number2,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=7-7}"/>
                <CheckBox IsChecked="{Binding Path=Number2,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=6-6}" />
                <CheckBox IsChecked="{Binding Path=Number2,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=5-5}" />
                <CheckBox IsChecked="{Binding Path=Number2,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=4-4}" />
                <CheckBox IsChecked="{Binding Path=Number2,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=3-3}" />
                <CheckBox IsChecked="{Binding Path=Number2,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=2-2}"/>
                <CheckBox IsChecked="{Binding Path=Number2,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=1-1}" />
                <CheckBox IsChecked="{Binding Path=Number2,Mode=TwoWay,Converter={StaticResource sResource2},ConverterParameter=0-0}" />
            </StackPanel>
        </Grid>
    private byte number1 = 0x34;
            public byte Number1
            {
                get { return number1; }
                set
                {
                    number1 = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Number1"));
                    //Console.WriteLine("set");
                }
            }
    
            private byte number2 = 0x58;
            public byte Number2
            {
                get { return number2; }
                set
                {
                    number2 = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Number2"));
                    //Console.WriteLine("set");
                }
            }

    不是很了解 xaml。不知道xmal中是怎么使用Converter类的。

    但是实验现象表明:当我现在操作0x34的时候,this.target=0x58.


    2019年11月18日 4:30
  • Hi,

    我的代码是Department与CheckBox绑定,不是你要的效果?

     <StackPanel x:Name="DepartmentsPanel" >
            <CheckBox Content="A"
                  IsChecked="{Binding  Path=Department, Converter={StaticResource DeptConverter}, ConverterParameter={x:Static local:Department.A }}"/>
            <CheckBox Content="B"
                  IsChecked="{Binding  Path=Department, Converter={StaticResource DeptConverter}, ConverterParameter={x:Static local:Department.B }}"/>
            <CheckBox Content="C"
                  IsChecked="{Binding  Path=Department, Converter={StaticResource DeptConverter}, ConverterParameter={x:Static local:Department.C }}"/>
            <CheckBox Content="D"
                  IsChecked="{Binding  Path=Department, Converter={StaticResource DeptConverter}, ConverterParameter={x:Static local:Department.D }}"/>
    
        </StackPanel>

    Best Regards,

    Alex


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年11月27日 8:40
    版主
  • 不是我要的效果
    2019年11月28日 7:55
  • 能给出具体的要求吗?或者数据吗?

    2019年11月28日 8:33
  • 你好 该问题我已解决,谢谢
    2019年11月29日 1:35
  • 如果可以给出解决方案,谢谢
    2019年11月29日 2:54
  • 我使用了byte值绑定了TextBox。

    使用了其对应的BitArray数据中的每一个元素绑定了每一个CheckBox。

    当byte值被set的时候,需要重新获取对应的BitArray值。

    当BitArray值被set的时候,也需要重新获得对应的byte值。

    有一个地方需要注意的是:

    如果改变了CheckBox的勾选,那么BitArray肯定也会随着改变,但是在set访问器那是不会被捕获的。因为绑定的只是BitArray数据中的一个元素,当这个元素发生变化的时候,是没有调用Set访问器的。

    所以要想其他办法捕获BitArray数据改变的时候

    2019年11月29日 5:12