2015-05-19 2 views
2

Может ли кто-нибудь сказать мне, возможно ли это. У меня есть datagrid WPF, и я хотел бы привязать заголовки столбцов к datagrid к свойствам/полям в коде.Привязать заголовок колонки WPat datagrid к свойству в коде за

Так вот, что я пробовал. Это мой код столбца.

<DataGridTextColumn Header="{Binding ElementName=frmAssetPPM, Path=HeaderProperty}" 

И вот что я добавил к окну xaml.

<Window .... Name="frmAssetPPM"> 

И это мое определение свойства в коде позади:

private const string HeaderPropertyConstant = "Property"; 
private string _headerProperty = HeaderPropertyConstant; 

public string HeaderProperty 
{ 
    get { return _headerProperty; } 
    set { _headerProperty = value; } 
} 

Однако при запуске приложения, я получаю сообщение об ошибке отображается в окне Output в VS.

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=HeaderProperty; DataItem=null; target element is 'DataGridTextColumn' (HashCode=47624635); target property is 'Header' (type 'Object') 

Может кто-нибудь сказать мне, что я делаю неправильно? Или если я могу это сделать? Я где-то читал, что столбцы являются отдельным объектом, и это иногда приводит к осложнениям.

+1

возможно дубликат [Binding DataGrid заголовок столбца к DataContext] (http://stackoverflow.com/questions/8891560/binding-datagrid-column-header-to-datacontext) – RogerN

ответ

2

Некоторые вещи сложно связать, потому что они не являются частью дерева Visual, например всплывающих окон или заголовков данных - datagrid. Хорошо известно обходное решение - использовать DataContextSpy от Джоша Смита. В основном вы создаете его как ресурс и придаете ему привязку. Затем используйте этот экземпляр в другом месте, где вы можете использовать контекст данных. Есть много примеров в Интернете, но, чтобы вы начали, что-то, как это должно работать ..

<DataGrid.Resources> 
    <DataContextSpy x:Key="dcSpy" 
        DataContext="{Binding ElementName=frmAssetPPM, Path=HeaderProperty}"/> 
.... 

, то ваше связывание будет работать:

<DataGridTextColumn Header="{Binding Source={StaticResource dcSpy}, Path=DataContext}" 

вот код Джоша Смита, если вы этого не сделаете найти его в сети:

public class DataContextSpy : Freezable 
{ 
    public DataContextSpy() 
    { 
     // This binding allows the spy to inherit a DataContext. 
     BindingOperations.SetBinding (this, DataContextProperty, new Binding()); 
    } 

    public object DataContext 
    { 
     get { return GetValue (DataContextProperty); } 
     set { SetValue (DataContextProperty, value); } 
    } 

    // Borrow the DataContext dependency property from FrameworkElement. 
    public static readonly DependencyProperty DataContextProperty = FrameworkElement 
     .DataContextProperty.AddOwner (typeof (DataContextSpy)); 

    protected override Freezable CreateInstanceCore() 
    { 
     // We are required to override this abstract method. 
     throw new NotImplementedException(); 
    } 
} 
+0

Спасибо , Я пробовал есть и не работает. У меня установлен набор данных Windows для ViewModel. Как вы думаете, почему он не работает? –

+0

ok, поэтому установите DataContext DataContext = "{Binding RelativeSource = {RelativeSource FindAncestor, AncestorType = {x: Type Window}}, Path = DataContext}, должно обязательно работать. Если вы не установили datacontext в окне после загрузки xaml, тогда это проблема синхронизации. –

+0

Вы уверены? Я вижу, что мы устанавливаем datacontext dcSpy в datacontext элемента name = frmAssetPPM. И в XAML у меня есть окно datacontext, установленное в ViewModel. ' ' –

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