WPF将多个组合框绑定到一个属性

时间:2019-01-07 13:44:34

标签: c# wpf combobox

我有一个数据网格,它的一个单元格是一个组合框,如:

df1 <- structure(list(country = c("Australia", "Australia", "Australia", 
"Australia", "Australia", "Australia", "Costa Rica", "Costa Rica", 
"Costa Rica", "Costa Rica"), ISO = c("AUS", "AUS", "AUS", "AUS", 
"AUS", "AUS", "CRI", "CRI", "CRI", "CRI"), year = c(1980L, 1981L, 
1982L, 1983L, 1984L, 1985L, 1980L, 1981L, 1982L, 1983L), 
`tfp level` = c(0.796980202, 
0.808527768, 0.790943801, 0.818122745, 0.827925146, 0.825170755, 
1.082085967, 1.033975005, 0.934024811, 0.920588791)),
class = "data.frame", row.names = c(NA, 
-10L))

正如您在每一行中看到的那样,在明细行中有一个组合框(使用按钮展开的行),每个组合框都绑定到一个属性:

<DataGrid x:Name="Applications"  RowStyle="{StaticResource CollapsedRow}" AutoGenerateColumns="false" CanUserAddRows="false" ItemsSource="{Binding Applications}">

<DataGrid.Columns>
   <DataGridTemplateColumn>
     <DataGridTemplateColumn.CellTemplate>
      <DataTemplate>
         <Button Content='&#709;' FontSize="9" Name="ExpanderButton" Click="OnGroupChange" />
      </DataTemplate>
 </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

 <DataGridTextColumn Width="181" Header="Name" Binding="{Binding Name, Mode=OneWay}" />

</DataGrid.Columns>

<DataGrid.RowDetailsTemplate>
 <DataTemplate>
  <ComboBox ItemsSource="{Binding Path=DataContext.Cabins, 
       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}" 
       SelectedValuePath="Id" IsSynchronizedWithCurrentItem="True"
       SelectedValue="{Binding Path=DataContext.SelectedCabin,
       RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
       mah:TextBoxHelper.Watermark="{Binding Path=DataContext.CabinsWatermark, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}}"
                                                                      Height="2" Width="300" Margin="10 5 10 10" HorizontalAlignment="Left">
 <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Converter={StaticResource GuidConverter}}"/>
    </DataTemplate>
</ComboBox.ItemTemplate> 
</ComboBox>
 </DataTemplate>
</DataGrid.RowDetailsTemplate>

</DataGrid>

现在的问题是,当我在组合框中选择项目时,我得到的不是单个值而是几个(我想我选择了一个组合框中的所有值),以确保我用测试代码仔细检查了一下后面:

 private Guid? selectedCabin;
    public override  Guid? SelectedCabin
    {
        get => selectedCabin;
        set
        {
            selectedCabin = value;
            if (value.HasValue)
            {
                Console.WriteLine(value);
            }

            OnPropertyChanged();
        }

我要到这里,组合框项目列表和强制转换异常。这可能是导致此问题的根本原因,并且有一种方法可以将多个组合框值绑定到一个属性,所以我选择了一个它将覆盖另一个属性。

1 个答案:

答案 0 :(得分:1)

似乎您正在将所有行详细信息SelectedValue的{​​{1}}绑定到同一源属性。而且您无法将ComboBoxes参数转换为sender。尝试投射Guid?的{​​{1}}属性:

SelecteedValue

如果您不想在视图中处理ComboBox事件,则可以使用一个交互触发器来执行设置源属性的命令。有关更多信息,请参考this blog post