2017-06-20 1 views
1

:) I ein Datenraster haben. In Spalte 2 steht "ComboBox1", in Spalte3 steht "ComboBox2". Ich möchte IsEnabled auf "ComboBox2" auf "False" setzen, solange "ComboBox1" SelectedIndex = 0 hat. Für jede Reihe einzeln.WPF: Binden eines Elements in einer Datagridtemplatecolumn auf ein Element in einer anderen Datagridtemplatecolumn

Dieses vollkommen außerhalb des Datagrid mit zwei Comboboxen arbeitet (mit Hilfe von Stil und Datatrigger). Innerhalb von Datagrid kann ich jedoch in Spalte3 "ComboBox1" nicht sehen ("Quelle für Bindung nicht finden ...").

Es ist im Grunde eine Namescope Ausgabe. Der Verweis auf eine Combobox in einem DataGrid nach Namen scheint jedoch in erster Linie falsch zu sein. Also: irgendwelche Ideen wie man das erreicht?

Vielen Dank im Voraus!

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

Bitte beachten Sie die CompositeCollection.

Antwort

0

jedoch mit Bezug auf eine Combobox in einem Datagrid nach Namen scheint in erster Linie als falsch. Also: irgendwelche Ideen wie man das erreicht?

sollten Sie binden die SelectedIndex Eigenschaft einer Quelle Eigenschaft Ihrer Modellklasse:

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

Vergewissern Sie sich, dass das Modell Typ implementiert die INotifyPropertyChanged Schnittstelle und erhöhen die PropertyChanged Ereignis in der Setzer: https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

+0

Danke! Die Modellklasse ist, was beide ComboBoxen gemeinsam haben - perfekt! Ich habe versucht, es über eine DependencyProperty (statt INotifyPropertyChanged) zu tun. Hat aus irgendeinem Grund nicht funktioniert, bis ich zusätzlich ein Ereignis über die DropDownClosed-Eigenschaft der ComboBox ausgelöst habe, die die DependencyProperty-Modelle festlegt. Funktioniert jetzt perfekt! :-) – Grent

0

versuchen, etwas wie folgt aus:

Ihre ComboBox1 ändern, indem die ausgewählte ID Hinzufügen SelectedValue="{Binding List3ComboBox1ItemId}", die List3ComboBox1ItemId Eigenschaft muss eine Eigenschaft von list3 sein

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

und Ihre ComboBox2 Sie einen Konverter umfassen müssen, um sicherzustellen, Ihre ID, wenn id> 0 wahr ist. (Nicht in dieser Antwort enthielt)

<ComboBox x:Name="ComboBox2" DisplayMemberPath="MyName" SelectedItem="{Binding List3ComboBox2Item}" IsEnabled={Binding List3ComboBox1ItemId, Converter={StaticResource IntegerToBoolConverter}} > 
Verwandte Themen