我想在加载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事件中工作?
答案 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}}"