我在过去一小时内一直在寻找应该是一个简单问题的解决方案:如何在Xceed的社区CheckBox
中创建一次点击可编辑的界限DataGridControl
要明确:我想要一个CheckBox
列,用户可以点击任意CheckBox
,无论选择哪一行,并拥有视图模型的IsSelected
属性相应地改变。
以下是我尝试过的最新排列。此代码从模型中读取值,但是出于某种原因,单击CheckBox
不会调用IsSelected
setter。
<xcdg:DataGridControl x:Name="DictionariesDataGridControl" ItemsSource="{Binding Mode=OneWay, Source={StaticResource DictionariesViewSource}}" AutoCreateColumns="False" AutoRemoveColumnsAndDetailConfigurations="False" SelectionMode="Extended" NavigationBehavior="RowOnly">
<xcdg:DataGridControl.View>
<xcdg:TableView UseDefaultHeadersFooters="False" ShowRowSelectorPane="False" VerticalGridLineThickness="0">
<xcdg:TableView.FixedHeaders>
<DataTemplate>
<xcdg:ColumnManagerRow BorderThickness="0"/>
</DataTemplate>
</xcdg:TableView.FixedHeaders>
</xcdg:TableView>
</xcdg:DataGridControl.View>
<xcdg:DataGridControl.Columns>
<xcdg:Column FieldName="IsSelected" MinWidth="20" MaxWidth="20" CellEditorDisplayConditions="RowIsCurrent">
<xcdg:Column.CellContentTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding ., Mode=OneWay}" IsHitTestVisible="False"/>
</DataTemplate>
</xcdg:Column.CellContentTemplate>
<xcdg:Column.CellEditor>
<xcdg:CellEditor>
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding ., Mode=TwoWay}"/>
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
</xcdg:CellEditor>
</xcdg:Column.CellEditor>
</xcdg:Column>
</xcdg:DataGridControl.Columns>
编辑1
我正在尝试这个,这正是我所需要的:
<xcdg:Column FieldName="IsSelected" MinWidth="20" MaxWidth="20" CellEditorDisplayConditions="Always"/>
除了,由于某种原因,CheckBox
的样式为蓝色背景!
我已在可视树中选择了Background
属性定义为SolidColorBrush
且#FF0000FF
为DataGridCheckBox
的元素:
编辑2
我反编译了Xceed用来呈现CheckBox
的{{1}}类并找到了这个覆盖:
public override void OnApplyTemplate()
{
base.OnApplyTemplate();
this.ChildCheckBox.Background = (Brush) new SolidColorBrush(Colors.Blue);
}
Xceed决定将背景颜色任意设置为蓝色是多么奇怪的决定。
编辑3
使用@ JBrooks&#39;回答,我尝试了以下几点:
<xcdg:Column FieldName="IsSelected" MinWidth="20" MaxWidth="20" CellEditorDisplayConditions="Always">
<xcdg:Column.CellEditor>
<xcdg:CellEditor>
<xcdg:CellEditor.EditTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding ., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</xcdg:CellEditor.EditTemplate>
</xcdg:CellEditor>
</xcdg:Column.CellEditor>
</xcdg:Column>
不幸的是,由于某些原因,当我选中该框时,永远不会调用IsSelected
属性上的setter。但是,getter被多次调用,并且CheckBox
es在初始绑定时正确显示。
答案 0 :(得分:1)
您同时拥有CellContentTemplate和CellEditor,因此第一次单击会执行“进入编辑模式”逻辑。只需要一个像下面这样的一个。这适用于普通的WPF DataGrid,但也许您可以为网格尝试类似的东西。
<DataGridTemplateColumn Header="Active" SortMemberPath="IsActive" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding IsActive, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding IsEnabled}" Style="{StaticResource rightsCB}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
对于这个DataGrid,我也设置了这些属性:
SelectedItem="{Binding SelectedUser, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}
”
SelectionUnit="FullRow" SelectionMode="Single"
因此,这个DataGrid的行为与您想要的一样 - 我单击第4行中的复选框和IsChecked更改,它还使第4行成为将SelectedUser设置为绑定到第4行的用户的当前行。