【发布时间】:2012-09-18 03:20:02
【问题描述】:
我有一个包含 2 列的数据网格,我想将第 2 列中的一些单元格显示为:
- 组合框
- 文本框
基于属性
代码:
解决方案 #1:
<Window.Resources>
<DataTemplate x:Key="DropDownTemplate">
<StackPanel>
<ComboBox SelectedValuePath="Id" DisplayMemberPath="Name" ItemsSource="{Binding MarketConfigurationLOVs, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="TextBoxTemplate">
<StackPanel>
<TextBox Text="{Binding ConfigurationValue, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
这里是数据网格标签:
<DataGrid ItemsSource="{Binding Path= MarketConfigurationValues,Mode=TwoWay}" HeadersVisibility="None" AutoGenerateColumns="False" CanUserAddRows="False">
<DataGrid.Columns>
<DataGridTextColumn Width="120" Binding="{Binding Path= ConfigurationName}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Content="{Binding}" >
<ContentControl.Style>
<Style TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding HasLOV}" Value="true">
<Setter Property="ContentTemplate" Value="{StaticResource DropDownTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding HasLOV}" Value="false">
<Setter Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" />
</DataTrigger>
<!-- and so on -->
</Style.Triggers>
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
这未能显示实际值,因为它显示属性的名称并始终在下拉列表中显示单元格,当我将 TextBoxContentTemplate 与 ComboBoxContentTemplate 交换时,它会将所有单元格显示为文本框,因此它似乎忽略了触发器但是当我调试时我发现HasLOV 有些项目包含真有些包含假
解决方案 #2: (同样失败) 参考:Jon 解决方案来自以下帖子 WPF MVVM Creating Dynamic controls
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl x:Name="MyContentControl" Content="{Binding}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding HasLOV}" Value="false">
<Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource TextBoxTemplate}" />
</DataTrigger>
<DataTrigger Binding="{Binding HasLOV}" Value="true">
<Setter TargetName="MyContentControl" Property="ContentTemplate" Value="{StaticResource DropDownTemplate}" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
ViewModel 是大类,但我把与我的问题相关的主要部分拉到了这里。在构造函数中,我创建了 MarketConfigurationValue 列表,并在 MarketConfigurationLOVs 中填充了值,以防我设置 HasLov=true 并在 configurationValue 中填充值,以防我设置 HasLov=false 并运行应用程序并在调试模式下找到主对象列表包含我正确地说的内容,但在 HasLov=true 的情况下无法显示组合框,在 HasLov=false 的情况下无法显示 textBox :
public class MarketConfigurationValue
{
public string ConfigurationName { get; set; }
public string ConfigurationValue { get; set; }
public int ConfigurationValueId { get; set; }
public List<Market_Config_Lov> MarketConfigurationLOVs {get;set;}
public bool HasLov { get; set; }
}
public class Market_Config_Lov
{
public virtual string Name { get; set; }
public virtual int Sequence { get; set; }
}
你能帮忙吗?
【问题讨论】:
-
尝试在 ContentControl 中通过 DataContext={Binding} 替换 Content={Binding}。
-
尝试将触发器放在 DataTemplate.Triggers 下。也许这可以帮助:codeproject.com/Articles/18303/…
-
@Florian GI:当我将 Content={Binding} 替换为 DataContext={Binding} 为:
文本框始终为空且没有下拉列表 -
我认为查看您的 ViewModel 会有所帮助。
-
@Florian GI :我更新了帖子以包含 ViewModel 你现在可以查看它