【问题标题】:How to get the value from a Template Column in a WPF DataGrid.如何从 WPF DataGrid 中的模板列中获取值。
【发布时间】:2016-05-03 08:53:52
【问题描述】:

我有一个包含复选框列的数据网格。我通过使用多选复选框一次检查所有行来对该表单进行了修改。它奏效了。但是当应用程序运行时我无法从该复选框列中获取值,因为我不确定如何访问数据列。任何人都可以帮助我获取复选框值(真/假)。 这就是我到目前为止所做的。

代码:xaml

<DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Path= Id}" Header="Id" Visibility="Hidden"/>
            <DataGridTextColumn Binding="{Binding Path= Category}" Header="Category" Width="320"/>
            <!--<DataGridCheckBoxColumn Binding="{Binding Path= Check}" Width="*"/>-->

            <DataGridTemplateColumn>
                <DataGridTemplateColumn.Header>
                    <CheckBox x:Name="headerCheckBox" />
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox Name="chkSelectAll" HorizontalAlignment="Center" IsChecked="{Binding IsChecked, ElementName=headerCheckBox, Mode=OneWay}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

        </DataGrid.Columns>

代码:C#

for (int i = 0; i < datagridview.Items.Count; i++)
            {
                ÇategoryData CD = (ÇategoryData)datagridview.Items[i];
                if (CD.Check == true)
                {
                    //it always returns false even checked 
                }
            }

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    首先,我看不到该值将用于什么?我的意思是,复选框就像一个 UI 机制来选择或取消选择所有其他框。但即使您确实需要该值,为什么不将它双向绑定到 ViewModel 属性?

    像这样:

    <CheckBox x:Name="headerCheckBox" Value="{Binding SelectAllCheckboxInTheViewModel}" />
    

    【讨论】:

    • 我使用该值(true 或 false)仅更新已检查的数据行。
    • 为什么要投反对票?这正是我的想法。您需要每行复选框状态的值,而不是标题的复选框值。
    • 是的,这就是我想要的,但我无法获得该复选框的值。我怎样才能访问它?
    • 正如他所说,您应该将行复选框的值绑定到 ViewModel 属性。
    • 你能建议一个链接或一些方法来做到这一点。我是 wpf 的新手。
    【解决方案2】:

    在我看来,这里有很多奇怪的东西。 我真的不明白为什么你的行的复选框被称为“chkSelectAll” 我建议您尝试获取以下内容:每个复选框都可以自己选中,取消选中。当您点击标题复选框时,所有列复选框都会获得相同的状态(如果至少有一个未选中,则选中,如果选中了所有行复选框,则选中)。

    如果这是正确的,那么您应该执行以下操作: 正如 Siderite Zackwehdex 提到的(我的意思是他的意思),您应该将 Checkbox IsChecked 值绑定到行的底层 ViewModel 的属性。

    您的 Headers Checkbox 还应该绑定到 Viewmodel 的属性,该属性包含 Observable 集合,如下所示:

    public bool AllSelected
    {
        get { return !this.MyCollection.Any(item => !item.IsSelected); }
        set
        {
            var toggle = this.MyCollection.Any(item => !item.IsSelected);
            foreach (var itm in this.MyCollection.Where(item => item.IsSelected != toggle))
                itm.IsSelected = toggle;
        }
    }
    

    Collection Items-ViewModel 的 IsSelected-Property-Setter 必须通知 ParentViewModel(它持有 Collection)一个 IsSelected/IsChecked(无论你想怎么称呼它)状态已经改变。这样就会引发 PropertyName "AllSelected" 的 PropertyChanged 事件。

    Collection Items ViewModel 属性可能如下所示:

    public bool IsSelected
    {
        get { return _isSelected; }
        set
        {
            _isSelected = value;
            RaisePropertyChanged("IsSelected");
            ParentViewModel.RaisePropertyChanged("IsSelected");
        }
    }
    

    两个 CheckBox(Header Template 中的一个和 CellTemplate 中的一个)都与 Mode=Twoway 绑定

    【讨论】:

      猜你喜欢
      • 2014-12-03
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 2019-07-09
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多