设计器中的wpf DataContext错误

时间:2011-03-29 00:11:39

标签: wpf silverlight datagrid designer

我有一个涉及(3)DataGrids的演示文稿,它们几乎相同,但又不同,以至于在代码中完成整个事情似乎更简洁。

它仍然是原始的(下面的类图),但除了一件事以外我的工作方式!视觉工作室设计师无法弄清楚DataContext的后期绑定,因此会引发错误。

下面是我如何拉动网格数据上下文以便在给定列中使用的示例,以及我得到的错误。

  1. 有没有人看到让设计师对现有代码感到满意的方法?
  2. 有没有人建议采用更好的方法?
  3. 我知道有办法给Blend一些数据概念,但我还不知道Blend。

    干杯,
    Berryl

    CODE

    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& DESIGNER ERROR

    <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
    

    CLASS DIAGRAM

    enter image description here

    enter image description here

2 个答案:

答案 0 :(得分:3)

如果您只需要让设计师再次工作,您可以在某处进行DesignerProperties.GetIsInDesignMode检查。

怎么样:

protected override string _GetHeaderText()  
    {  
        if (!DesignerProperties.GetIsInDesignMode(this))  
        {  
            return _GetDataContext().PresentationSubject;  
        }  
        else  
        {  
            return "Design Mode Text";  
        }  
    }

答案 1 :(得分:1)

您可以使用作为WPF一部分的Designer属性来解决您的设计器问题。关注this link to an MSDN article on Design-time attributes并专门查看d:DataContext属性。如果您可以创建网格绑定到的类的示例实现,您可以让设计师再次为您工作。