2017-06-20 107 views
1

:)我有一个DataGrid。在Column2中有“ComboBox1”,在Column3中有“ComboBox2”。只要“ComboBox1”的SelectedIndex = 0,我想在“ComboBox2”上将IsEnabled设置为false。分别为每一行。WPF:将DataGridTemplateColumn中的元素绑定到另一个DataGridTemplateColumn中的元素

这可以完美的在Datagrid之外用两个组合框(在Style和DataTrigger的帮助下)。但是,在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

然而,通过名称引用到一个ComboBox一个DataGrid中似乎有问题摆在首位。那么:任何想法如何实现这一点?

您应该SelectedIndex属性绑定到你的模型类的源属性:

<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事件:https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged(v=vs.110).aspx

+0

谢谢!模型类是ComboBox的共同点 - 完美!我试图通过DependencyProperty(而不是INotifyPropertyChanged)来做到这一点。由于某种原因没有工作,直到我另外通过ComboBox的DropDownClosed属性引发了一个事件,该属性设置了DependencyProperty模型。 现在完美! :-) – 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则返回true。 (不包括在此答案)

<ComboBox x:Name="ComboBox2" DisplayMemberPath="MyName" SelectedItem="{Binding List3ComboBox2Item}" IsEnabled={Binding List3ComboBox1ItemId, Converter={StaticResource IntegerToBoolConverter}} > 
相关问题