简体   繁体   English

使用绑定设置WPF DataGrid ComboBoxColumn ItemSource-MVVM

[英]Set WPF DataGrid ComboBoxColumn ItemSource with Binding - MVVM

To explain my problem I did a small demo Application. 为了解释我的问题,我做了一个小型演示应用程序。 I have a DataGrid with several TextColumns and a ComboBoxColumn - the Binding for the TextColumns works well, but not for the ComboBoxColumn. 我有一个带有几个TextColumns和一个ComboBoxColumn的DataGrid-TextColumns的绑定效果很好,但ComboBoxColumn的绑定效果不好。

The data comes from this simple Model: 数据来自以下简单模型:

public class Model
{
    public Model()
    {
        Text = "text";
        ComboText = "T2";
    }
    public string Text { get; set; }
    public string ComboText { get; set; }
}

My ViewModel has two Collections: a list of models to show in the Datagrid and a list of strings to show in the Combobox dropdown (this list should later be not static). 我的ViewModel有两个Collections:一个在Datagrid中显示的模型列表和一个在Combobox下拉列表中显示的字符串列表(此列表以后应该不是静态的)。

    public class MainWindowViewModel
{
    private ObservableCollection<Model> _model;
    public MainWindowViewModel()
    {
        _model = new ObservableCollection<Model>();
        _model.Add(new Model());
        ComboItems = new ObservableCollection<string>();
        ComboItems.Add("T1");
        ComboItems.Add("T2");
        ComboItems.Add("T3");
        ComboItems.Add("T4");
        ComboItems.Add("T5");
    }

    public ObservableCollection<Model> Models
    {
        get
        {
            return _model;
        }
    }

    public ObservableCollection<string> ComboItems
    { get; private set; }
}

In my view's Code Behind i only set the DataContext of the view to MainWindowView Model: 在我的视图背后的代码中,我仅将视图的DataContext设置为MainWindowView Model:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        DataContext = new ViewModels.MainWindowViewModel();
        InitializeComponent();
    }
}

I knew, I can set the ComboBox Itemssource here(witch works), but i can not access this class later from the ViewModel to update it. 我知道,我可以在此处设置ComboBox Itemssource(女巫的作品),但是以后我无法从ViewModel访问此类以对其进行更新。

I set the Itemssource of the Data Grid to Models and the Binding for the TextColumns is fine. 我将数据网格的Itemssource设置为Models,并且TextColumns的绑定很好。 But setting the ComboBoxColumns itemsource to DataContext.ComboItems (or just ComboItems) doesn't work. 但是将ComboBoxColumns项源设置为DataContext.ComboItems(或仅将ComboItems)是行不通的。

<Window x:Class="TestCombobox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:TestCombobox"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <DataGrid AutoGenerateColumns="False" Name="MyDataGrid" ItemsSource="{Binding Models}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="TextColumn" Binding="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
            <DataGridComboBoxColumn Header="Combo" ItemsSource="{Binding DataContext.ComboItems}" SelectedValueBinding="{Binding ComboText}" DisplayMemberPath="{Binding ComboText}"/>
            <DataGridTemplateColumn Header="TemplateColumn">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox ItemsSource="{Binding DataContext.ComboItems}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Any solutions / ideas to solve this? 有解决方案/想法来解决这个问题吗? Thanks for your help. 谢谢你的帮助。

You have to use RelativeSource : 您必须使用RelativeSource

<DataGrid AutoGenerateColumns="False" Name="MyDataGrid" ItemsSource="{Binding Models}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="TextColumn" Binding="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
        <DataGridTemplateColumn Header="TemplateColumn">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding DataContext.ComboItems, 
                        RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

Or ElementName : ElementName

<DataGrid AutoGenerateColumns="False" Name="MyDataGrid" ItemsSource="{Binding Models}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="TextColumn" Binding="{Binding Text, UpdateSourceTrigger=PropertyChanged}"/>
        <DataGridTemplateColumn Header="TemplateColumn">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding DataContext.ComboItems, 
                        ElementName=MyDataGrid}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM