使用 DataTempülate 创建可编辑的 GridviewColumn
Creating editable GridviewColumn with DataTempülate
我有一个可观察的集合通过它的 ItemsSource 属性 绑定到我的 ListView。
我使用 GridView 来显示 ListView 中的项目。
通过在我的 ViewModel 中将“IsServiceMode”属性 设置为“true”(DataContext 到包含 ListView 的 UserControl),我想更改 GridViewColumn 以使用 TextBox 而不是 Textblock。
我将 CellTemplates 与 ContentControl 和 DataTemplate 一起使用 here
但是,尽管编辑器建议使用“位置”,但文本块和文本框控件中的“绑定位置”似乎不起作用。 Position 是绑定 ObservableCollection 中项目的 属性,可以通过 DisplayMemberBinding 使用而不会出现问题。
我的 GridViewColumn
<GridViewColumn Header="Position">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.IsServiceMode, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Position, diag:PresentationTraceSources.TraceLevel=High}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding DataContext.IsServiceMode, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="True">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox Text="{Binding Position}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>´´´
- Datagrid自带编辑模式。 IsReadOnly 被打开和关闭。
- 当编辑模式为 enabled.Like ObservableCollection
时,itemSource 必须实现 INotifyCollectionChanged
演示
<DataGrid
x:Name="DataGrid1"
ItemsSource="{Binding Path=ObservableCollection}"
IsReadOnly="{Binding Path=IsServiceMode}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Position" Binding="{Binding Path=Position,Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>
我有一个可观察的集合通过它的 ItemsSource 属性 绑定到我的 ListView。 我使用 GridView 来显示 ListView 中的项目。 通过在我的 ViewModel 中将“IsServiceMode”属性 设置为“true”(DataContext 到包含 ListView 的 UserControl),我想更改 GridViewColumn 以使用 TextBox 而不是 Textblock。 我将 CellTemplates 与 ContentControl 和 DataTemplate 一起使用 here
但是,尽管编辑器建议使用“位置”,但文本块和文本框控件中的“绑定位置”似乎不起作用。 Position 是绑定 ObservableCollection 中项目的 属性,可以通过 DisplayMemberBinding 使用而不会出现问题。
我的 GridViewColumn
<GridViewColumn Header="Position">
<GridViewColumn.CellTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.Style>
<Style TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.IsServiceMode, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding Position, diag:PresentationTraceSources.TraceLevel=High}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding DataContext.IsServiceMode, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="True">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox Text="{Binding Position}"/>
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>´´´
- Datagrid自带编辑模式。 IsReadOnly 被打开和关闭。
- 当编辑模式为 enabled.Like ObservableCollection 时,itemSource 必须实现 INotifyCollectionChanged
演示
<DataGrid
x:Name="DataGrid1"
ItemsSource="{Binding Path=ObservableCollection}"
IsReadOnly="{Binding Path=IsServiceMode}" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="Position" Binding="{Binding Path=Position,Mode=TwoWay}"/>
</DataGrid.Columns>
</DataGrid>