我有一个涉及(3)DataGrids的演示文稿,它们几乎相同,但又不同,以至于在代码中完成整个事情似乎更简洁。
它仍然是原始的(下面的类图),但除了一件事以外我的工作方式!视觉工作室设计师无法弄清楚DataContext的后期绑定,因此会引发错误。
下面是我如何拉动网格数据上下文以便在给定列中使用的示例,以及我得到的错误。
我知道有办法给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;
}
}
<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
答案 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属性。如果您可以创建网格绑定到的类的示例实现,您可以让设计师再次为您工作。