Wpf многократная привязка combobox к одному свойству - PullRequest
0 голосов
/ 07 января 2019

У меня есть сетка данных, одна из ее ячеек представляет собой поле со списком, например:

<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();
        }

Теперь проблема в том, что, когда я выбираю элемент в поле со списком, я получаю не одно значение, а несколько из них (я полагаю, что все значения из одного поля со списком, на котором я сделал выбор), чтобы убедиться, что я дважды проверил код теста за:

     private void ComboBox_OnSelectCabinChanged(object sender, RoutedEventArgs e)
    {
        var combo = (ComboBox)sender;

        if (combo != null && combo.IsDropDownOpen)
        {
            ((ApplicationsViewModel)DataContext).SelectedCabin = (Guid?)sender;
            combo.IsDropDownOpen = false;
        }
    }

И я получаю здесь список элементов со списком и исключение при использовании. Что может быть основной причиной этого и есть ли способ привязать несколько значений поля со списком к одному свойству, поэтому если я выберу одно, оно переопределит другое.

1 Ответ

0 голосов
/ 07 января 2019

Похоже, что вы связываете SelectedValue из всех подробностей строки ComboBoxes с одним и тем же свойством источника. И вы не можете привести sender аргумент к Guid?. Попробуйте разыграть SelecteedValue свойство ComboBox:

SelectedCabin = (Guid?)combo.SelectedValue;

Если вы не хотите обрабатывать событие SelectionChanged в представлении, вы можете использовать триггер взаимодействия, который выполняет команду, которая устанавливает свойство источника. Пожалуйста, обратитесь к этому сообщению в блоге для получения дополнительной информации об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...