C# 确保一次只选中一个复选框
我有WPF数据网格,其中包含两行复选框:C# 确保一次只选中一个复选框,c#,wpf,checkbox,mvvm,C#,Wpf,Checkbox,Mvvm,我有WPF数据网格,其中包含两行复选框: <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="3*"/> </Grid.ColumnDefinitions> <DataGrid VerticalAlignment="Stretch"
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<DataGrid VerticalAlignment="Stretch"
HorizontalAlignment="Stretch"
Name="dsGrid"
AutoGenerateColumns="False" Grid.Column="1" >
<DataGrid.Columns>
<DataGridTextColumn Header="Properties Name" MinWidth="150" Binding="{Binding Propertie}" />
<DataGridTemplateColumn Header=" Server " MinWidth="150" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Name="PropertiesTextBlock"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Text="{Binding Server}"
Grid.Column="1"/>
<CheckBox IsChecked="{Binding Path=IsServerSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Checked="Server_Checked"
VerticalAlignment="Center"
HorizontalAlignment="Left"
Visibility="{Binding Equal,
Converter={StaticResource BoolToVisibility},FallbackValue=Hidden}"
Grid.Column="0"/>
</Grid>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header=" Local " MinWidth="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Name="PropertiesTextBlock"
HorizontalAlignment="Right"
Text="{Binding Local}"
Grid.Column="1"/>
<CheckBox IsChecked="{Binding Path=IsLocalSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
Checked="Local_Checked" HorizontalAlignment="Left"
Visibility="{Binding Equal, Converter={StaticResource BoolToVisibility},FallbackValue=Hidden}" Grid.Column="0"></CheckBox>
</Grid>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<ListBox HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" Name="Entities_List"
SelectionChanged="Entities_List_SelectionChanged"
SelectionMode="Single"
Grid.Column="0"/>
<Button Content="Merge"
Name="Merge_Button"
Click="Merge_Button_Click"
HorizontalAlignment="Stretch"
VerticalAlignment="Bottom"
Grid.Column="0" />
</Grid>
我的需要是确保一次只选中一个复选框。
因此,如果选中ServerCheckBox,我想取消选中LocalCheckBox。您几乎获得了所需的一切:
public bool IsLocalSelected
{
get
{
return pIsLocalSelected;
}
set //LocalSelected is Set: -> UnSet Server
{
pIsLocalSelected = value;
OnPropertyChanged("IsLocalSelected");
IsServerSelected = false;
OnPropertyChanged("IsServerSelected");
}
}
public bool IsServerSelected
{
get
{
return pIsServerSelected;
}
set //ServerSelected is Set: -> UnSet Local
{
pIsServerSelected = value;
OnPropertyChanged("IsServerSelected");
IsLocalSelected = false;
OnPropertyChanged("IsLocalSelected");
}
}
这样就行了
但这将创建一个无限循环…
为了以最简单的方式解决此问题,我建议使用单选按钮
而不是复选框
。
如果选择了本地,则服务器将被取消选择,反之亦然。我已修复了您问题中的格式设置。你会从阅读帮助页中受益,了解未来的问题。如果我添加了这些更改,我将有步兵循环。当然,我应该看到这一点。我强烈建议你改用单选按钮。我仍然有StackOverflowException(@Fe De只需使用单选按钮,你就不需要再禁用另一个。我使用单选按钮。这里可能有问题:IsChecked=“{Binding Path=IsLocalSelected,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}”@Fe De
public bool IsLocalSelected
{
get
{
return pIsLocalSelected;
}
set //LocalSelected is Set: -> UnSet Server
{
pIsLocalSelected = value;
OnPropertyChanged("IsLocalSelected");
IsServerSelected = false;
OnPropertyChanged("IsServerSelected");
}
}
public bool IsServerSelected
{
get
{
return pIsServerSelected;
}
set //ServerSelected is Set: -> UnSet Local
{
pIsServerSelected = value;
OnPropertyChanged("IsServerSelected");
IsLocalSelected = false;
OnPropertyChanged("IsLocalSelected");
}
}