2016-06-14 3 views
2

Я имею в DataGrid с DataGridComboBoxColumn в WPF проекте установлен так:WPF DataGridComboBoxColumn не работает

<DataGridComboBoxColumn Header="Master" SelectedItemBinding="{Binding MasterId}" SelectedValueBinding="{Binding Id}" DisplayMemberPath="Id" ItemsSource="{Binding Masters}" /> 

но при запуске проекта на дисплее столбца только пустые значения и выпадающие в режиме редактирования делает то же самое вещь.

DataGrid устанавливается следующим образом:

<DataGrid Name="ReadersGrid" Grid.Row="0" Grid.Column="0" Margin="3" ItemsSource="{Binding Readers}" CanUserAddRows="True" CanUserDeleteRows="True" AutoGenerateColumns="False"> 

И UserControl так:

<UserControl x:Class="SmartAccess.Tabs.ReadersTab" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:SmartAccess.Tabs" 
    mc:Ignorable="d" 
    d:DesignHeight="300" d:DesignWidth="300" DataContext="{StaticResource ReadersListViewModel}"> 

и другие столбцы, только текст, прекрасно работают.

ViewModel обладает этими свойствами

public ObservableCollection<ReaderViewModel> Readers { get; set; } 
public IEnumerable<ReaderViewModel> Masters => Readers.Concat(new List<ReaderViewModel> { new ReaderViewModel { Id = -1 } }).OrderBy(t => t.Id); 

И коллекция ViewModel обладает этими свойствами

public long Id { get; set; } 
public long MasterId { get; set; } 

Я отображающие Id только для теста, описание имущества будет добавлено в будущем.

Почему ComboBoxColumn не работает?

+0

Я не вижу вопрос. Порекомендуйте вам ознакомиться с http://stackoverflow.com/help/mcve за советом о том, как задать такой вопрос. И добро пожаловать в переполнение стека! –

+0

Есть, вероятно, проблемы с привязкой, посмотрите на окна вывода вашего проекта, он должен сообщить вам, какие свойства не найдены, и где он их ищет. – omerts

+0

Ошибка @omerts заключается в следующем: 'System.Windows.Data Error: 2: Не удается найти управляющий элемент FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = Masters; DataItem = NULL; целевым элементом является «DataGridComboBoxColumn» (HashCode = 24534150); target свойство - «ItemsSource» (тип «IEnumerable») ', но я не понимаю –

ответ

3

Ваша проблема вызвана DataGridColumns: действительно, они do not belong to the visual tree, поэтому вы не можете привязать свои свойства к DataContext.

Вы можете найти here решение, основанное на своеобразном замораживаться «DataContext прокси», так как Freezable объекты могут наследовать DataContext, даже если они не находятся в визуальном дереве.

Теперь, если вы поместите этот прокси-сервер в DataGrid «s ресурсов, она может быть объять DataGrid» s DataContext и может получить с помощью ключевого слова StaticResource.

Таким образом, вы XAML будет:

<DataGridComboBoxColumn Header="Master" SelectedItemBinding="{Binding MasterId}" 
    SelectedValueBinding="{Binding Id}" DisplayMemberPath="Id" 
    ItemsSource="{Binding Data.Masters, Source={StaticResource proxy}}" /> 

proxy Где это имя вашего ресурса.

Надеюсь, это может вам помочь.

EDIT

Я обновляю свой ответ с кодом, скопированного из этого link (из-за комментария @ icebat в). Это BindingProxy класс:

public class BindingProxy : Freezable 
{ 
    #region Overrides of Freezable 

    protected override Freezable CreateInstanceCore() 
    { 
     return new BindingProxy(); 
    } 

    #endregion 

    public object Data 
    { 
     get { return (object)GetValue(DataProperty); } 
     set { SetValue(DataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for Data. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty DataProperty = 
     DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null)); 
} 

Тогда в XAML вам нужно добавить:

<DataGrid.Resources> 
    <local:BindingProxy x:Key="proxy" Data="{Binding}" /> 
</DataGrid.Resources> 
+0

Я не совсем понимаю этот пример, но он работает так, как ожидалось. Спасибо. –

+0

@icebat, пожалуйста, взгляните на мое редактирование –

+0

@IlVic, это здорово! – icebat

Смежные вопросы