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 タグ:

<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:( これも失敗しました)参照:次の投稿のJonソリューションWPF MVVM Making 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 のリストを作成し、HasLov=true を設定した場合に備えて MarketConfigurationLOV 内に値を入力し、HasLov=false を設定してアプリケーションを実行し、デバッグ モードでメイン オブジェクト List を見つけた場合に備えて configurationValue に値を入力しました。私が正しく言ったことを含んでいますが、 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