我有一个包含几个记录的数据网格。网格非常简单,因为它只有四列。网格的最后两列分别是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; }
}
答案 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