Datagrid-Checkbox选择和取消选择

时间:2012-06-25 18:21:25

标签: c# wpf xaml datagrid

我有一个包含几个记录的数据网格。网格非常简单,因为它只有四列。网格的最后两列分别是Option1和Option2。现在我有一个问题,如果是从Option1列选择行的复选框,然后如果我要在同一行上选择Option2,那么应该取消选择该行中选定的Option1。我也尝试使用单选按钮,但它没有工作,因为它检查或取消选中整行。我希望操作应该在同一行上发生。

由于

代码 -

<Window x:Class="Convertor.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"       
    Title="MainWindow" Height="350" Width="525">

<Grid>
    <DataGrid x:Name="dgEmp" CanUserAddRows="False" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Binding="{Binding Path=Id}" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="*"></DataGridTextColumn>
            <DataGridTemplateColumn Header="Option1" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="ch1"></CheckBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Option2" Width="*">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox x:Name="ch2" ></CheckBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

</Grid>

 private ObservableCollection<Emp> _empList;
    public MainWindow()
    {
        InitializeComponent();
        BindEmpDetails();
    }

    private void BindEmpDetails()
    {
        _empList = new ObservableCollection<Emp>()
        {
            new Emp(){Id=1,Name="XYZ"},
            new Emp(){Id=1,Name="ABC"},
        };
        dgEmp.ItemsSource = _empList;
    }
}

public class Emp
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Working { get; set; }
    public bool Retired { get; set; }
}

2 个答案:

答案 0 :(得分:2)

我会做什么(Emp应该实施 INotifyProperyChanged ):

 public class Emp : INotifyPropertyChanged
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Working
    {
        get { return working_; }
        set
        {
            if (working_ != value)
            {
                working_ = value;
                retired_ = !working_;
                OnPropertyChanged("Retired");
                OnPropertyChanged("Working");
            }

        }
    }
    public bool Retired
    {
        get { return retired_; }
        set
        {
            if (retired_ != value)
            {
                retired_ = value;
                working_ = !retired_;
                OnPropertyChanged("Retired");
                OnPropertyChanged("Working");
            }

        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    private bool retired_;
    private bool working_;
    public void OnPropertyChanged(string PropertyName) {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
    }
}

另外添加此绑定:

<CheckBox x:Name="ch1" Checked="{Binding Retired}"></CheckBox>

另外一个是为了工作。

非常确定还有另一种聪明的方法,但这是我的头脑。

答案 1 :(得分:2)

这似乎是最好的单选按钮,就像你之前尝试过的那样。如果您为两个单选按钮提供相同的 GroupName ,则无论它们在窗口中的位置如何,它们都应该是互斥的。这样,用户只能选择“工作”或“退休”。

<RadioButton GroupName="IsWorking" Content="Working" />
<RadioButton GroupName="IsWorking" Content="Retired" />

http://msdn.microsoft.com/en-us/library/system.windows.controls.radiobutton.groupname.aspx