0

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

  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 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:( 也失败了)参考:来自以下帖子WPF MVVM 创建动态控件的 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 的情况下无法显示组合框,在 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; }
    }

你能帮忙吗?

4

1 回答 1

0

下面介绍如何实现 INotifyPropertyChanged 接口。这样,当调用 HasLOV 的设置器时,绑定会自行更新。

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。

于 2012-09-27T09:52:09.843 回答