2012-09-26 117 views
0

我有包含2列的数据网格,我想展示一些列#2细胞是:DatagridTemplateColumn与触发器无法绑定

  1. 组合框
  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的标签:

<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; } 
    } 

能否请你帮忙吗?

+0

尝试在ContentControl中通过DataContext = {Binding}替换Content = {Binding}。 –

+0

尝试在DataTemplate.Triggers下放置触发器。也许这可以帮助:http://www.codeproject.com/Articles/18303/A-Guided-Tour-of-WPF-Part-4-Data-templates-and-tri – Per

+0

@Florian GI:当我将Content = {绑定}与DataContext = {绑定}是:文本框始终是空的,没有下拉 –

回答

0

下面介绍如何实现INotifyPropertyChanged接口。在调用HasLOV的setter时,绑定会自动更新。

public class MarketConfigurationValue:INotifyPropertyChanged 
{ 
    private bool _hasLOV; 
    public bool HasLOV 
    { 
     get {return _hasLOV;} 
     set {_hasLOV = value; OnPropertyChanged("HasLOV");} 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     VerifyPropertyName(propertyName); 

     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 
} 

希望这会有所帮助。

====>属性名称是类名为HasLov的属性中的属性,并在XAML中称为HasLOV。

+0

它也失败了 –

+0

我把这件作品放在一个独立的项目中,我希望你能检查它。我可以将它附在这里,还是直接发给你? –

+0

您可以将其发送到我的电子邮件地址;) –