2017-06-20 26 views
1

:) DataGridは1つあります。 Column2には "ComboBox1"があり、Column3には "ComboBox2"があります。 "ComboBox1"にSelectedIndex = 0が指定されている限り、 "ComboBox2"でIsEnabledをfalseに設定したいと思います。各行ごとに別々にWPF:DataGridTemplateColumnの要素を別のDataGridTemplateColumnの要素にバインドする

これは2つのコンボボックス(StyleとDataTriggerの助けを借りて)でDatagridの外で完全に動作します。しかし、Datagridの中で、Column3では "ComboBox1"( "バインディングのソースを見つけることができません...")が表示されません。

これは基本的に名前スコープの問題です。しかし、名前でDataGrid内のComboboxを参照することは、最初は間違っているようです。だから:どのようにこれを達成するためのアイデア?

ありがとうございます!

<Window.Resources> 
    <CollectionViewSource x:Key="Source1" Source="{Binding List1}" /> 
    <CollectionViewSource x:Key="Source2" Source="{Binding List2}" /> 
</Window.Resources> 

<DataGrid x:Name="ModelControl" AutoGenerateColumns="False" ItemsSource="{Binding List3}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding MyName}" Header="Modellname" /> 
     <DataGridTemplateColumn Header="Header 1"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ComboBox x:Name="ComboBox1" DisplayMemberPath="MyName" SelectedIndex="0"> 
         <ComboBox.ItemsSource> 
          <CompositeCollection> 
           <CollectionContainer Collection="{Binding Source={StaticResource Source2}}" /> 
          </CompositeCollection> 
         </ComboBox.ItemsSource> 
        </ComboBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTemplateColumn Header="Header 2"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ComboBox x:Name="ComboBox2" DisplayMemberPath="MyName"> 
         <ComboBox.Style> 
          <Style TargetType="{x:Type ComboBox}"> 
           <Setter Property="IsEnabled" Value="True" /> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding SelectedIndex,ElementName=ComboBox1}" Value="0"> 
             <Setter Property="IsEnabled" Value="False" /> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </ComboBox.Style> 
         <ComboBox.ItemsSource> 
          <CompositeCollection> 
           <CollectionContainer Collection="{Binding Source={StaticResource Source1}}" /> 
          </CompositeCollection> 
         </ComboBox.ItemsSource> 
        </ComboBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

CompositeCollectionを気にしないでください。

答えて

0

はしかし、名前でのDataGrid内のコンボボックスを参照すると、最初の場所で間違っているようです。だから:どのようにこれを達成するためのアイデア?

<DataGrid x:Name="ModelControl" AutoGenerateColumns="False" ItemsSource="{Binding List3}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding MyName}" Header="Modellname" /> 
     <DataGridTemplateColumn Header="Header 1"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ComboBox x:Name="ComboBox1" DisplayMemberPath="MyName" 
             SelectedIndex="{Binding YourIndexProperty}"> 
         <ComboBox.ItemsSource> 
          <CompositeCollection> 
           <CollectionContainer Collection="{Binding Source={StaticResource Source2}}" /> 
          </CompositeCollection> 
         </ComboBox.ItemsSource> 
        </ComboBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
     <DataGridTemplateColumn Header="Header 2"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <ComboBox x:Name="ComboBox2" DisplayMemberPath="MyName"> 
         <ComboBox.Style> 
          <Style TargetType="{x:Type ComboBox}"> 
           <Setter Property="IsEnabled" Value="True" /> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding YourIndexProperty}" Value="0"> 
             <Setter Property="IsEnabled" Value="False" /> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </ComboBox.Style> 
         <ComboBox.ItemsSource> 
          <CompositeCollection> 
           <CollectionContainer Collection="{Binding Source={StaticResource Source1}}" /> 
          </CompositeCollection> 
         </ComboBox.ItemsSource> 
        </ComboBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

は、モデルタイプがINotifyPropertyChangedインタフェースを実装していることを確認し、セッターにPropertyChangedイベントを上げる:

は、あなたのモデルクラスのソースプロパティにSelectedIndexプロパティをバインドする必要がありhttps://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

+0

ありがとう!モデルクラスは、両方のComboBoxが共通しているのは完璧です!私はDependencyProperty(INotifyPropertyChangedの代わりに)を介してそれをやろうとしました。何らかの理由で、DependencyPropertyモデルを設定するComboBoxのDropDownClosedプロパティを使用してイベントを追加発生させるまで、何らかの理由で動作しませんでした。 今すぐ完璧に動作します! :-) – Grent

0

はこのような何かしてみてください:

選択されたID SelectedValue="{Binding List3ComboBox1ItemId}"を追加して、ComboBox1のを修正し、List3ComboBox1ItemIdプロパティは、あなたが確認するために、コンバータを含める必要がLIST3

<ComboBox x:Name="ComboBox1" DisplayMemberPath="MyName" SelectedValue="{Binding List3ComboBox1ItemId}"> 
    <ComboBox.ItemsSource> 
     <CompositeCollection> 
      <CollectionContainer Collection="{Binding Source={StaticResource Source2}}" /> 
     </CompositeCollection> 
    </ComboBox.ItemsSource> 
</ComboBox> 

とあなたのcombobox2の財産である必要がありますあなたのid、もしid> 0が真を返すならば。 (この答えには含まれません)

<ComboBox x:Name="ComboBox2" DisplayMemberPath="MyName" SelectedItem="{Binding List3ComboBox2Item}" IsEnabled={Binding List3ComboBox1ItemId, Converter={StaticResource IntegerToBoolConverter}} > 
関連する問題