如何将CheckBoxes绑定到WPF中的二维数组?

时间:2016-08-18 15:50:52

标签: wpf data-binding

我是WPF的新手,所以请耐心等待我。我有一个二维int数组(8x8),一个统一的网格(8行和8列)。在我的网格的每个单元格中都有一个CheckBox。当我点击一个复选框时,我希望我的数组中的相应元素从" 0"到" 1"。当我再次取消选中CheckBox时,我希望这个更改能够反映在我的数组中。

此外,我将从我的int [8,8]矩阵中取出每一行(例如10010101 - 统一网格中的第一个复选框被选中,第二个未被检查等等),将其转换为十进制数字单击按钮时通过串口发送。

然后我想改变发送过程(处理所有8行并发送数据),这样每次我点击网格中的复选框时都会发生这种情况。

我对Bindings很感兴趣。 我希望有人可以就如何做到这一点给我一个建议。

这是我的XAML代码。不知何故,我成功地为我的第一个CheckBox创建了一个绑定,但是我并不理解它为什么工作以及如果我做了最好的编码。如果我以这种方式继续,我应该为我的数组中的每个元素创建一个属性,并且我确定这不是正确的方法(因为我硬编码数据[0,0])。

    <Window x:Class="CheckBox_Matrix_Binding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="220" Width="200" ResizeMode="NoResize" >
    <Grid x:Name="mainGrid">

        <Grid.RowDefinitions>
            <RowDefinition Height="4*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <UniformGrid x:Name="checkBoxGrid" Grid.Row="0" Rows="3" Columns="3" >
            <CheckBox x:Name="ChekBox0" HorizontalAlignment="Center" VerticalAlignment="Center" IsChecked="{Binding Mode=TwoWay, Path=DataProperty}" />
            <CheckBox x:Name="ChekBox1" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <CheckBox x:Name="ChekBox2" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <CheckBox x:Name="ChekBox3" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <CheckBox x:Name="ChekBox4" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <CheckBox x:Name="ChekBox5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <CheckBox x:Name="ChekBox6" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <CheckBox x:Name="ChekBox7" HorizontalAlignment="Center" VerticalAlignment="Center"/>
            <CheckBox x:Name="ChekBox8" HorizontalAlignment="Center" VerticalAlignment="Center"/>

        </UniformGrid>
        <Grid Grid.Row="1" x:Name="buttonsGrid">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Button x:Name="btnSetTrue"  VerticalAlignment="Center" Grid.Column="0" Content="Set _True" Margin="5" Click="btnSetTrue_Click"  ></Button>
            <Button x:Name="btnSetFalse" VerticalAlignment="Center" Grid.Column="1" Content="Set _False" Margin="5" Click="btnSetFalse_Click"  ></Button>
        </Grid>

    </Grid>

</Window>

这是我背后的代码:

using System;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;

namespace CheckBox_Matrix_Binding
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        private DataMatrix _dataMatrix = new DataMatrix() ;
        public bool _DataMatrixProperty
        {
            get { return _dataMatrix.DataProperty; }
            set
            {
                _dataMatrix.DataProperty = value;
            }
        }
        public MainWindow()
        {

            InitializeComponent();
            checkBoxGrid.DataContext = _dataMatrix;                    
        }

        private void ChekBox0_Checked(object sender, RoutedEventArgs e)
        {

        }

        private void btnSetTrue_Click(object sender, RoutedEventArgs e)
        {
            _dataMatrix.DataProperty = true;
        }

        private void btnSetFalse_Click(object sender, RoutedEventArgs e)
        {
            _dataMatrix.DataProperty = false;
        }        
    }

     //THe class DataMatrix implements INotifyPropertyChanged interface
    public class DataMatrix: INotifyPropertyChanged
    {
       public event PropertyChangedEventHandler PropertyChanged;
       private bool[,] data;
       public bool DataProperty //this is a property
       {
           get { return data[0, 0]; }
           set { 
                 data[0, 0] = value;
                 OnPropertyChanged("DataProperty");
               }
       }
       public DataMatrix()
       {
           data = new bool[3, 3];
       }

       public void OnPropertyChanged(string propertyName)
       {
           if (PropertyChanged != null)
           {
               PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
           }
       }
    }  
}

我应该使用其他方法吗? 谢谢你提前:))

0 个答案:

没有答案