【问题标题】:DataGridCheckBoxColumn Checked change when Usercontrol LoadedDataGridCheckBoxColumn 在加载用户控件时检查更改
【发布时间】:2018-09-04 18:33:26
【问题描述】:

我想在加载用户控件时更改 DataGridCheckBoxColumn 选中的属性。

数据网格:

<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 事件中工作?

【问题讨论】:

  • 为什么不简单地将 DataGrid 绑定到带有 bool 的 Items 集合,并将绑定设置为两种方式?
  • 我不知道这个。我该怎么做呢?
  • 如果我的回答对你有帮助,请采纳!

标签: c# wpf datagrid wpfdatagrid


【解决方案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 中。

其次,在您的主 viewModel 或您的 mainWindow 的代码隐藏中,添加一个 ObservableCollection 来保存您的 DataGridItemSource

 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 接口。

最后,在usercontrol 中更新您的DataGrid,以便使用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:上面Window的DataContext设置为它的codebehind使用:DataContext="{Binding RelativeSource={RelativeSource Self}}"

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2012-01-09
    相关资源
    最近更新 更多