WPF GridControl:在聚焦行时自动勾选复选框,在取消聚焦时取消勾选

时间:2013-06-01 13:37:23

标签: c# wpf

我有一些带有一些列的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>

2 个答案:

答案 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");
    }
}