0

我有一个带有一些列的 WPF 网格控件。我还有一个带有复选框的 checkedit 列。

我希望完成的是当用户在网格控件中选择一行(单击一行)时,我希望复选框自动被选中。

然后当用户单击不同的行时,新选择的行中的复选框将变为选中状态,而先前选择的行中的复选框将变为未选中状态。

复选框被禁用,因此用户不需要单击实际的复选框本身,而是单击同一行中的任何位置。

基本上,复选框是作为一个指示器,向用户显示他们点击了哪一行,这样他们就知道当他们点击删除按钮时他们有正确的记录。

希望这是足够的描述性。

谢谢

编辑:对不起所有..我使用的是 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>
4

2 回答 2

1

您可以使用SelectedCellsChanged事件,并在您的事件处理程序中遍历您的项目并将选择布尔值设置为 False(确保它通过 NotifyPropertyChanged 通知或者是一个依赖属性,以便 UI 会知道更改)之后,使用发件人作为一个 Grid 并遍历他的 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; }
}
于 2013-06-01T13:58:58.440 回答
1

您必须定义绑定到网格的集合类型的属性,并且数据网格的 SelectedItem 应该绑定到此属性。因此,每当触发此属性的选择行更改设置器时。在 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");
    }
}
于 2013-06-01T13:59:11.477 回答