DataGridCheckBoxColumn在Usercontrol加载时检查更改

时间:2018-03-26 14:53:20

标签: c# wpf datagrid wpfdatagrid

我想在加载usercontrol时更改DataGridCheckBoxColumn checked属性。

的Datagrid:

<DataGrid BorderThickness="0"  Name="grid_kaynak" Margin="1" MaxHeight="200" RowHeight="28" AutoGenerateColumns="False"  CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" ColumnWidth="*" HorizontalGridLinesBrush="#FFDCDBDB" VerticalGridLinesBrush="#FFDCDBDB" HeadersVisibility="None" Background="{x:Null}" LayoutUpdated="grid_kaynak_LayoutUpdated">
                                        <DataGrid.Columns>

                                            <DataGridCheckBoxColumn Header="check_kaynak" MaxWidth="27" >
                                                <DataGridCheckBoxColumn.ElementStyle>
                                                    <Style TargetType="CheckBox">
                                                        <Setter Property="VerticalContentAlignment" Value="Center"></Setter>
                                                        <Setter Property="HorizontalAlignment" Value="Center"></Setter>
                                                    </Style>
                                                </DataGridCheckBoxColumn.ElementStyle>
                                            </DataGridCheckBoxColumn>

                                        </DataGrid.Columns>
                                    </DataGrid>

当我尝试在Usercontrol_loaded事件中检查更改时返回“对象引用未设置为对象的实例”。但是当我尝试使用buttonclick事件时,它可以工作!就像这样:

private void btn_kaynak_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 0; i < grid_kaynak.Items.Count; i++)
        {
            var item = grid_kaynak.Items[i];
            var mycheckbox = grid_kaynak.Columns[1].GetCellContent(item) as CheckBox;
            if ((bool)mycheckbox.IsChecked == false)
            {
                mycheckbox.IsChecked = true;
            }
        }
    }

如何在Usercontrol_loaded事件中工作?

1 个答案:

答案 0 :(得分:1)

首先,为DataGridItem

定义模型
public class Model:INotifyPropertyChanged
{

    private bool _checked;

    public bool Checked
    {
        get { return _checked; }
        set
        {
            if (value == _checked) return;
            _checked = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

确保您的模型实现INotifyPropertyChanged接口,以便Checked属性中的任何更改都将反映在UI中。

其次,在您的主视图模型或您的mainWindow代码隐藏中,添加一个ObservableCollection来保存DataGrid ItemSource

 private ObservableCollection<Model> _dgCollection = new ObservableCollection<Model>()
    {
        new Model(){Checked = true},
        new Model(){Checked = false},
        new Model(){Checked = true},
    };
    public ObservableCollection<Model> DgCollection
    {
        get { return _dgCollection; }
        set
        {
            if (Equals(value, _dgCollection)) return;
            _dgCollection = value;
            OnPropertyChanged();
        }
    }

还要确保您的主ViewModel实现INotifyPropertyChanged接口。

最后,更新您的DataGrid usercontrol,以便ObservableCollection填充它:

<DataGrid BorderThickness="0" ItemsSource="{Binding DgCollection}" Name="grid_kaynak" Margin="1" MaxHeight="200" RowHeight="28" AutoGenerateColumns="False"  CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" ColumnWidth="*" HorizontalGridLinesBrush="#FFDCDBDB" VerticalGridLinesBrush="#FFDCDBDB" HeadersVisibility="None" Background="{x:Null}">
        <DataGrid.Columns>

            <DataGridCheckBoxColumn Header="check_kaynak" MaxWidth="27" Binding="{Binding Checked}">
                <DataGridCheckBoxColumn.ElementStyle>
                    <Style TargetType="CheckBox">
                        <Setter Property="VerticalContentAlignment" Value="Center"></Setter>
                        <Setter Property="HorizontalAlignment" Value="Center"></Setter>
                    </Style>
                </DataGridCheckBoxColumn.ElementStyle>
            </DataGridCheckBoxColumn>

        </DataGrid.Columns>
    </DataGrid>

现在,您可以从mainWindow代码隐藏或viewModel处理用户控件的Loaded事件:

<Window ...
   Title="MainWindow" DataContext="{Binding RelativeSource={RelativeSource Self}}" Name="MainWindows" >
   <Grid>
       <local:UserControl1 Loaded="FrameworkElement_OnLoaded"/>
    </Grid>
</Window>

事件处理程序:

 private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
    {
        foreach (var model in DgCollection)
        {
            model.Checked = true;
        }
    }

Ps:上面窗口的DataContext设置为其代码隐藏使用:DataContext="{Binding RelativeSource={RelativeSource Self}}"