带触发器的DatagridTemplateColumn无法绑定

时间:2012-09-26 13:22:09

标签: wpf xaml

我有一个包含2列的数据网格,我想在第2列显示一些单元格:

  1. ComboBox
  2. 文本框
  3. 基于属性

    代码:

    解决方案#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中的Jon解决方案

    <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的情况下无法显示comboBox而在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; }
        }
    

    你能帮忙吗?

1 个答案:

答案 0 :(得分: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);
        }
    }
}

希望这有帮助。

====&gt;属性名称是拼写错误,因为类中的属性称为:HasLov,而在XAML中称为HasLOV。