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

时间:2018-07-20 07:40:27

标签: c# wpf mvvm combobox datagrid

为解释我的问题,我做了一个小型演示应用程序。 我有一个带有多个TextColumns和一个ComboBoxColumn的DataGrid-TextColumns的绑定效果很好,但ComboBoxColumn的绑定效果不好。

数据来自这个简单的模型:

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

我的ViewModel有两个集合:要在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; }
}

在我的视图后面的代码中,我仅将视图的DataContext设置为MainWindowView Model:

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

我知道,我可以在此处设置ComboBox Itemssource(女巫可以使用),但是以后我无法从ViewModel访问此类以对其进行更新。

我将数据网格的Itemssource设置为Models,并且TextColumns的绑定很好。但是将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>

有解决方案/想法解决吗? 感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您必须使用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>

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>