【问题标题】:WPF GridControl : Tick checkbox automatically when row is focused and untick on unfocusWPF GridControl:当行获得焦点时自动勾选复选框并在取消焦点时取消勾选
【发布时间】:2013-06-01 13:37:22
【问题描述】:

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

【问题讨论】:

  • 如果您显示 Datagrid 和 SelectedItem(如果已处理)代码,对您的帮助会相对容易。

标签: c# wpf


【解决方案1】:

您必须定义绑定到网格的集合类型的属性,并且数据网格的 SelectedItem 应该绑定到此属性。因此,只要选定的行更改此属性的SATTER就会触发。在 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");
    }
}

【讨论】:

  • 选择答案,因为它回答了最接近我需要的原始问题。谢谢大家花时间回答我的问题。非常感激。两人也投票
【解决方案2】:

您可以使用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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多