WPF DataGridComboBoxColumn Binding?

1

Я пытаюсь включить столбец ComboBox в WPat datagrid. Я пытаюсь связать этот столбец с наблюдаемой коллекцией в ViewModel, однако во время выполнения ячейки остаются пустыми. Datacontext правильный, так как все нормальные столбцы успешно связываются. Я хочу отобразить "regionShortCode" в пользовательском интерфейсе. Вот мой xaml:

   <DataGridComboBoxColumn Header="Region" DisplayMemberPath="regionShortCode" Width="SizeToHeader">
       <DataGridComboBoxColumn.ElementStyle>
           <Style>
             <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=MembershipsCollection}" />
             </Style>
                </DataGridComboBoxColumn.ElementStyle>
                 <DataGridComboBoxColumn.EditingElementStyle>
              <Style>
                 <Setter Property="ComboBox.ItemsSource" Value="{Binding Path=MembershipsCollection}" />
              </Style>
           </DataGridComboBoxColumn.EditingElementStyle>
     </DataGridComboBoxColumn>

И вот мой ObservableCollection, объявленный в ViewModel. Коллекция успешно заполнена методом, вызванным в конструкторе:

private ObservableCollection<tbAccountMembership> _MembershipsCollection;
    public ObservableCollection<tbAccountMembership> MembershipsCollection
    {
        get { return _MembershipsCollection; }
        set
        {
            _MembershipsCollection = value;
            OnPropertyChanged("MembershipsCollection");
        }
    }     

Во время выполнения я получаю:

System.Windows.Data Error: 40 : BindingExpression path error: 'MembershipsCollection' property not found on 'object' ''tbAccountMembership_041E43AFC29975F12C156BA1373ACD47FC07BBE55614E5AF8AD3BBD9F090C133' (HashCode=46247020)'. BindingExpression:Path=MembershipsCollection; DataItem='tbAccountMembership_041E43AFC29975F12C156BA1373ACD47FC07BBE55614E5AF8AD3BBD9F090C133' (HashCode=46247020); target element is 'TextBlockComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

в окне вывода. Почему Xaml не может решить эту привязку? благодаря

  • 0
    Я пытаюсь привязать этот столбец к наблюдаемой коллекции в ViewModel ... это правильно? Вы хотите связать данные с одним свойством коллекции в модели представления, а не с одним в классе элемента данных? Если так, то ваш ответ на вопрос: почему Xaml не может разрешить эту привязку? потому что вы не сказали Framework, где искать фактическое свойство ... вам нужно использовать RelativeSource Binding .
  • 0
    Я хочу привязать к одному элементу в ObservableCollection
Показать ещё 2 комментария
Теги:
xaml
wpf
mvvm

3 ответа

1
Лучший ответ

Если вы хотите привязать данные к одному свойству коллекции в модели представления из DataGrid, тогда ваш ответ на Почему не может Xaml решить эту привязку? потому что вы не сказали Framework, где искать фактическое свойство... вам нужно использовать [RelativeSource Binding ] 1. Попробуйте это вместо этого:

<DataGridComboBoxColumn Header="Region" DisplayMemberPath="regionShortCode" 
    Width="SizeToHeader">
    <DataGridComboBoxColumn.ElementStyle>
        <Style>
            <Setter Property="ComboBox.ItemsSource" Value="{Binding 
                DataContext.MembershipsCollection, RelativeSource={RelativeSource 
                AncestorType={x:Type YourViewModelsPrefix:YourViewModel}}}" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style>
            <Setter Property="ComboBox.ItemsSource" Value="{Binding 
                DataContext.MembershipsCollection, RelativeSource={RelativeSource 
                AncestorType={x:Type YourViewsPrefix:YourView}}}" />
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

С помощью этого Binding Path YourView Framework будет выглядеть вне нормального DataGrid.DataContext для свойства с именем MembershipsCollection в объекте, который задан как DataContext для YourView (очевидно, это не настоящее имя) UserControl или Window. Если y наша модель представления правильно установлена как DataContext тогда это должно работать нормально.

1

Вы должны предоставить точный путь к коллекции для привязки к источнику items из combobox. для этого сделайте своего предка в качестве основного элемента управления, т.е. окна или пользовательского контроля

           <DataGridComboBoxColumn Header="Category"
SelectedValueBinding="{Binding category_cde}"
  SelectedValuePath="category_cde"
DisplayMemberPath="category_dsc">
                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding Path=CATEGORIES , RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>
                        <DataGridComboBoxColumn.EditingElementStyle>
                            <Style TargetType="ComboBox">
                            <Setter Property="ItemsSource" Value="{Binding Path=CATEGORIES , RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
                            </Style>
                        </DataGridComboBoxColumn.EditingElementStyle>
                    </DataGridComboBoxColumn>

            </DataGrid.Columns>
        </DataGrid>

И вот коллекция категорий i, определенных в коде, где категория - это какой-то класс, вы можете определить свою собственную коллекцию

 List<Category> m_categories = new List<Category>();
    public List<Category> CATEGORIES
    {
        get { return m_categories; }
        set { m_categories = value; }
    }
-2

Гораздо проще решить проблему с DataGridComboBoxColumn - это установить программную привязку ItemSource в конструктор класса Window.

<DataGrid x:Name="MembershipGridNormal" AutoGenerateColumns="False" SelectedIndex="0" ItemsSource="{Binding}">
            <DataGrid.Columns>

                <DataGridTextColumn Header="Name" Binding="{Binding Prop1}"/>
                <DataGridTextColumn Header="Value" Binding="{Binding Prop2}"/>
                <DataGridComboBoxColumn x:Name="CmbMemberShips" Header="RawValues" DisplayMemberPath="Name" />

            </DataGrid.Columns>
        </DataGrid>

в коде

public Win32599087()
        {
            InitializeComponent();

            MemberShipGridNormal.DataContext = myCollection;

            Binding b = new Binding();
            b.Source =  myCollection;
            b.Path = new PropertyPath("collectionpropertyname");

            BindingOperations.SetBinding(CmbMemberships, DataGridComboBoxColumn.ItemsSourceProperty, b);
        }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню