Ошибка wConf DataContext в конструкторе - PullRequest
1 голос
/ 29 марта 2011

У меня есть презентация, включающая (3) DataGrids, которые почти одинаковы, но достаточно различны, что кажется более чистым дизайном, позволяющим выполнять все в коде.

Он все еще сырой (диаграмма классов ниже), но работает так, как я хочу, за исключением одной вещи! Дизайнер Visual Studio не может определить позднюю привязку DataContext, поэтому он выдает ошибку.

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

  1. Кто-нибудь видит способ порадовать дизайнера существующим кодом?
  2. У кого-нибудь есть предложения по лучшему подходу?

Я знаю, что есть способы дать Blend некоторое представление о данных, но я пока не знаю Blend.

Приветствия
Berryl

код

public abstract class TimesheetGridColumn : DataGridTextColumn
{
    ...

    protected ActivityCollectionViewModel _GetDataContext() { return (ActivityCollectionViewModel) DataGridOwner.DataContext; }

    public virtual void SetHeader() {
        var tb = new TextBlock
                 {
                     Text = _GetHeaderText(),
                     ToolTip = _GetHeaderToolTip(),
                 };
        Header = tb;
    }
    ....
}

public class ActivityDescriptionColumn : TimesheetGridColumn
{
    ...

    *** WORKS at RUNTIME but DESIGNER does not know that ******* 
    protected override string _GetHeaderText() { 
        return _GetDataContext().PresentationSubject; 
    }

}

XAML SNIPPET & ОШИБКА КОНСТРУКТОРА

<Expander Header="{Binding DisplayName}" BorderThickness="1" IsExpanded="True">

    <dataGrid:ActivityDataGrid /> <=============== simple but error

</Expander>

System.NullReferenceException
Object reference not set to an instance of an object.
at ...ColumnSubclasses.ActivityDescriptionColumn._GetHeaderText() in ActivityDescriptionColumn.cs:line 24

ДИАГРАММА КЛАССА

enter image description here

enter image description here

Ответы [ 2 ]

3 голосов
/ 29 марта 2011

Если все, что вам нужно, это заставить дизайнера снова работать, вы, вероятно, можете поставить чек DesignerProperties.GetIsInDesignMode где-нибудь.

Как насчет:

protected override string _GetHeaderText()  
    {  
        if (!DesignerProperties.GetIsInDesignMode(this))  
        {  
            return _GetDataContext().PresentationSubject;  
        }  
        else  
        {  
            return "Design Mode Text";  
        }  
    }
1 голос
/ 29 марта 2011

Возможно, вам удастся решить проблему дизайнера с помощью атрибутов дизайнера, которые являются частью WPF.Перейдите по этой ссылке на статью MSDN об атрибутах времени разработки и обратите особое внимание на атрибут d: DataContext.Если вы сможете создать пример реализации класса, к которому привязаны ваши сетки, вы сможете снова заставить дизайнера работать на вас.

...