Использование WPF DataGridComboBoxColumn с MVVM - привязка к свойству в ViewModel

Я использую отличный инструментарий MVVM Light. Моя ViewModel предоставляет:

public const string CourtCodesTypeCourtPropertyName = "CourtCodesTypeCourt";
private List<CourtType> _courtCodesTypes = new List<CourtType>();
public List<CourtType> CourtCodesTypeCourt
{
    get
    {
        return _courtCodesTypes;
    }

    set
    {
        if (_courtCodesTypes == value)
        {
            return;
        }

        var oldValue = _courtCodesTypes;
        _courtCodesTypes = value;

        // Update bindings and broadcast change using GalaSoft.MvvmLight.Messenging
        RaisePropertyChanged(CourtCodesTypeCourtPropertyName, oldValue, value, true);
    }
}

public const string CourtCodesPropertyName = "CourtCodes";
private List<Court> _courtCodes = null;
public List<Court> CourtCodes
{
    get
    {
        return _courtCodes;
    }

    set
    {
        if (_courtCodes == value)
        {
            return;
        }

        var oldValue = _courtCodes;
        _courtCodes = value;

        // Update bindings and broadcast change using GalaSoft.Utility.Messenging
        RaisePropertyChanged(CourtCodesPropertyName, oldValue, value, true);
    }
}

Представление имеет DataGrid:

<DataGrid
      ItemsSource="{Binding CourtCodes, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
      AutoGenerateColumns="False"
      AlternatingRowBackground="{DynamicResource OffsetBrown}"
      AlternationCount="1" Margin="45,0">
   <DataGrid.Columns>
    <DataGridTextColumn Binding="{Binding Abbreviation, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         Header="Abbreviation"
         Width="25*" />
    <DataGridTextColumn Binding="{Binding FullName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         Header="Court"
         Width="75*" />
    <DataGridComboBoxColumn Header="CourtType" 
         ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CourtCodesTypeCourt} TextBinding="{Binding CourtTypeDescription}""/>
   </DataGrid.Columns>
  </DataGrid>

DataGrid имеет ItemsSource, как вы можете видеть, CourtCodes. Я хочу, чтобы столбец CourtType был выпадающим списком всех перечисленных типов CourtType, которые содержатся в CourtCodesTypeCourt. На мой взгляд, я не могу заполнить DataGridComboBoxColumn чем-либо. Текущая неудачная попытка пытается использовать RelativeSource ... что я делаю не так?

В дополнение к тому, что я не работаю, я вижу две ошибки:

System.Windows.Data Error: 4: Cannot найти источник для привязки со ссылкой 'RelativeSource FindAncestor, AncestorType = 'System.Windows.Window', AncestorLevel = '1'». BindingExpression: Path = DataContext.CourtCodesTypeCourt; DataItem = NULL; целевой элемент 'DataGridComboBoxColumn' (HashCode = 38771709); целевое свойство is 'ItemsSource' (тип 'IEnumerable')

и

System.Windows.Data Ошибка: 40: Ошибка пути BindingExpression: Свойство 'CourtCodesTypeCourt' не найдено на «объекте» «суд» (HashCode = 38141773). BindingExpression: Path = CourtCodesTypeCourt.CourtTypeDescription; DataItem = 'Court' (HashCode = 38141773); целевой элемент - «ComboBox» (Name = ''); целевое свойство 'Текст' (введите 'String')

11
задан Mike L 25 August 2010 в 04:51
поделиться

1 ответ

Определения столбцов DataGrid не участвуют в логическом дереве так, как можно было бы ожидать.Это смешно, но в последний раз я проверял, что вы должны сделать что-то вроде этого:

<DataGridComboBoxColumn Header="CourtType" SelectedItemBinding="{Binding Type}">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CourtCodesTypeCourt}"/>
            <Setter Property="IsReadOnly" Value="True"/>
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.CourtCodesTypeCourt}"/>
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

Вы заметите, что я также изменил вашу TextBinding на SelectedItemBinding. Я не уверен, действительно ли вы имели в виду TextBinding, но если вы просто хотите позволить пользователю выбирать между списком, то SelectedItemBinding, скорее всего, то, что вам нужно.

Кроме того, ваши виртуальные машины не совсем соответствуют рекомендациям. Вы используете List вместо ObservableCollection, и вы предоставляете его как List, а не что-то более простое, например ICollection.

28
ответ дан 3 December 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: