首页 文章

使用Binding - MVVM设置WPF DataGrid ComboBoxColumn ItemSource

提问于
浏览
1

为了解释我的问题,我做了一个小型演示应用程序我有一个带有几个TextColumns和一个ComboBoxColumn的DataGrid - TextColumns的Binding运行良好,但不适用于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; }
}

在我的视图中,Code Behind我只将视图的DataContext设置为MainWindowView Model:

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

我知道,我可以在这里设置ComboBox Itemssource(巫婆工作),但我以后无法从ViewModel访问此类来更新它 .

我将数据网格的Itemssource设置为Models,TextColumns的Binding很好 . 但是将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

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

相关问题