如何从WPF DataGrid中的模板列获取值。

时间:2016-05-03 08:53:52

标签: c# wpf datagrid

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

代码: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 
                }
            }

2 个答案:

答案 0 :(得分:1)

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

像这样:

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

答案 1 :(得分:0)

在我看来,这里有很多奇怪的事情。 我真的不知道为什么你的行&#39;复选框被称为&#34; chkSelectAll&#34; 我建议你尝试获得以下内容:每个Checkbox都可以自己检查,UnChecked。当您点击Headers Checkbox时,所有Columns Checkbox都会获得相同的状态(如果未选中至少一个,则选中,如果选中了所有行复选框,则选中Unchecked)。

如果这是对的,那么你应该做以下事情: 正如Siderite Zackwehdex所提到的那样(我的意思是),你应该将Checkbox IsChecked Value绑定到Row的基础ViewModel的属性。

比你的Headers Checkbox也应该绑定到Viewmodel的一个Property,它包含Observable Collection,如下所示:

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;
    }
}

集合项的IsSelected-Property-Setter-ViewModel必须通知ParentViewModel(它拥有Collection)一个IsSelected / IsChecked(但是你要调用它)状态已经改变。因此PropertyName的PropertyChanged事件&#34; AllSelected&#34;将被提出。

Collection Items ViewModel Property可能如下所示:

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

两个CheckBoxes(标题模板中的一个和CellTemplate中的一个)都与Mode=Twoway绑定