Чтобы объяснить свою проблему, я сделал небольшое демонстрационное приложение. У меня есть DataGrid с несколькими TextColumns и ComboBoxColumn - привязка для 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; }
}
В моем представлении Code Behind я устанавливаю только DataContext представления для модели MainWindowView:
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>
Любые решения / идеи для решения этой проблемы? Спасибо за вашу помощь.





Вы должны использовать 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>
@ user3067685 Отлично! Очевидно, это был просто пример. Не забудьте принять предложение и проголосовать за него, если это было полезно для вас.
Большое спасибо! Я сделал это с помощью RelativeSource, и он работает. Я только добавил SelectedValue = "{Binding ComboText}", чтобы показать уже установленные значения.