我有包含2列的数据网格,我想展示一些列#2细胞是:DatagridTemplateColumn与触发器无法绑定
- 组合框
- 文本框
代码:
解决方案#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的标签:
<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进行了交换,它将所有单元格显示为textBox,因此它似乎忽略了该触发器,但是当我调试时,我发现HasLOV中的一些项目包含true并且一些包含false
解决方案2:(也没有)参考:从以下后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>
视图模型乔恩的解决方案是大课,但我在这里拉与我的问题的主要部分。在构造函数中,我创建了MarketConfigurationValue的列表,并且在MarketConfigurationLOVs中填充了值,以防如果我设置HasLov = true并且我在configurationValue中填充了值(如果我设置了HasLov = false并且运行该应用程序并在调试模式下),我发现主对象列表包含了我正确的说,但失败了的情况下,显示组合框HasLov =真和文本框的情况下,HasLov =假:
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下放置触发器。也许这可以帮助:http://www.codeproject.com/Articles/18303/A-Guided-Tour-of-WPF-Part-4-Data-templates-and-tri – Per
@Florian GI:当我将Content = {绑定}与DataContext = {绑定}是:文本框始终是空的,没有下拉 –