为解释我的问题,我做了一个小型演示应用程序。 我有一个带有多个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>
有解决方案/想法解决吗? 感谢您的帮助。
答案 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>