我有一些带有一些列的WPF网格控件。我还有一个带复选框的checkit列。
我希望实现的是当用户在网格控件中选择一行(单击一行)时,我希望自动选中该复选框。
然后当用户点击另一行时,新选中行中的复选框将被选中,之前选中的行中的复选框将被取消选中。
复选框已禁用,因此用户无需单击实际的复选框本身,而是在同一行的任何位置。
基本上,该复选框用作指示器,向用户显示他们点击的确切行,以便他们知道他们在点击删除按钮时拥有正确的记录。
希望这是足够描述性的。
由于
编辑:对不起所有..我使用的是DevExpress数据网格,它似乎不允许以下答案中的属性..<!-- DX Grid with charges -->
<dxg:GridControl Grid.Row="1" Grid.ColumnSpan="7" FocusableChanged="FinanceOperationsGrid_FocusableChanged" Grid.RowSpan="6" DataSource="{Binding FinanceOperations}" x:Name="FinanceOperationsGrid">
<dxg:GridControl.Columns>
<dxg:GridColumn Width="20" AllowEditing="False" ShowInColumnChooser="False" AllowAutoFilter="False" />
<dxg:GridColumn Width="20" UnboundType="Boolean" AllowEditing="True" ShowInColumnChooser="False" AllowAutoFilter="False">
<dxg:GridColumn.CellTemplate>
<DataTemplate>
<dxe:CheckEdit x:Name="chkSelectedRow" IsThreeState="False" HorizontalAlignment="Center" VerticalAlignment="Center">
</dxe:CheckEdit>
</DataTemplate>
</dxg:GridColumn.CellTemplate>
</dxg:GridColumn>
<dxg:GridColumn Header="Created" AllowEditing="False" FieldName="Created" />
<dxg:GridColumn Header="Operation type" AllowEditing="False" FieldName="OperationDisplay" />
<dxg:GridColumn Header="Amount" AllowEditing="False" FieldName="Amount">
<dxg:GridColumn.EditSettings>
<dxe:SpinEditSettings MaskType="Numeric" MaskUseAsDisplayFormat="True" Mask="c2" />
</dxg:GridColumn.EditSettings>
</dxg:GridColumn>
<dxg:GridColumn Header="Description" AllowEditing="False" FieldName="Description" />
</dxg:GridControl.Columns>
<dxg:GridControl.View>
<dxg:TableView BestFitArea="Header" BestFitMode="AllRows" AutoWidth="True" ShowGroupPanel="False" ShowAutoFilterRow="True" MultiSelectMode="Row" NavigationStyle="Row"
RowStyle="{StaticResource AccountHistoryRowStyle}" DataRowTemplate="{StaticResource ChargeRowTemplate}" FocusedRow="{Binding SelectedOperation, Mode=TwoWay}">
<dxg:TableView.Resources>
<DataTemplate x:Key="{dxgt:RowIndicatorThemeKey ResourceKey=FocusedIconTemplate}">
<Canvas Width="20" Height="20">
<Rectangle Fill="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Width="20" Height="20" />
<Polygon Points="5,5 5,15 10,10" Fill="Blue" />
</Canvas>
</DataTemplate>
</dxg:TableView.Resources>
</dxg:TableView>
</dxg:GridControl.View>
</dxg:GridControl>
答案 0 :(得分:1)
您可以使用SelectedCellsChanged
事件,并在您的事件处理程序中迭代您的项目并将选择布尔值设置为False(确保它通过NotifyPropertyChanged通知或者是Dependency属性,以便UI知道更改)
之后,将发送者用作网格并迭代他的SelectedItems并将选定的布尔值设置为True:
<强>的.xaml:强>
<DataGrid ItemsSource="{Binding MyItems}" SelectionMode="Single" SelectedCellsChanged="DataGrid_OnSelectedCellsChanged">
<DataGrid.Columns>
<DataGridCheckBoxColumn IsReadOnly="True" Binding="{Binding Selected}"/>
<DataGridTextColumn Binding="{Binding Name}"/>
</DataGrid.Columns>
</DataGrid>
<强>的.cs:强>
public partial class MainWindow : Window
{
public ObservableCollection<NameItem> MyItems { get; set; }
public MainWindow()
{
MyItems = new ObservableCollection<NameItem>();
MyItems.Add(new NameItem() { Name = "A" });
MyItems.Add(new NameItem() { Name = "B" });
DataContext = this;
InitializeComponent();
}
private void DataGrid_OnSelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e)
{
foreach (var item in MyItems)
{
item.Selected = false;
}
var datagrid = sender as DataGrid;
if (datagrid != null)
foreach (var item in datagrid.SelectedItems)
{
var nameItem = item as NameItem;
if (nameItem != null) nameItem.Selected = true;
}
}
}
public class NameItem : DependencyObject
{
public static readonly DependencyProperty SelectedProperty =
DependencyProperty.Register("Selected", typeof (Boolean), typeof (NameItem), new PropertyMetadata(default(Boolean)));
public Boolean Selected
{
get { return (Boolean) GetValue(SelectedProperty); }
set { SetValue(SelectedProperty, value); }
}
public String Name { get; set; }
}
答案 1 :(得分:1)
您必须定义绑定到网格的集合类型的属性,并且datagrid的SelectedItem应绑定到此属性。因此,每当选择行更改时,都会触发此属性的setter。在setter中,将绑定到复选框的属性设置为适当的值,以便勾选复选框。
XAML
<DataGrid Grid.Row="1" SelectedItem="{Binding SelectedMilestoneItem}" Name="MilestoneGrid"
ItemsSource="{Binding MilestoneGridData}"
视图模型
public MilestoneItemViewModel SelectedMilestoneItem
{
get
{
return selectedMilestoneItem;
}
set
{
selectedMilestoneItem = value;
selectedMilestoneItem.CheckBoxValue = true;
NotifyPropertyChange("SelectedMilestoneItem");
}
}