1

いくつかのレコードを持つデータ グリッドがあります。4 つの列しかないため、グリッドは非常に単純です。グリッドの最後の 2 列は、それぞれ 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; }
}
4

2 に答える 2

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));
    }
}

さらに、この Binding を追加します。

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

働くためのプラスワン。

それを行う別の賢い方法があることは確かですが、これは私の頭の上にあります。

于 2012-06-25T18:33:36.780 に答える
2

前に試したように、これはラジオボタンを使用するのが最適なようです。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

于 2012-06-25T18:33:50.390 に答える