我想知道如何通过将列定义放入样式来共享两个网格之间的列定义?
原因?我想在两个单独的网格之间共享这些列定义。网格有大约20列,因此要在所有网格上复制“挖出”以保持它们同步,这需要做很多工作。
以下是一个示例网格:
<dxg:GridControl ItemsSource="{Binding ItemsSource}">
<dxg:GridControl.Columns>
<dxg:GridColumn x:Name="Codice" Binding="{Binding Codice}" FieldName="Codice"/>
<dxg:GridColumn x:Name="Nome" Binding="{Binding Nome}" FieldName="Nome"/>
</dxg:GridControl.Columns>
</dxg:GridControl>
我已经尝试将列定义转换为样式,因此我可以在两个网格之间共享列定义,但是,我不断收到错误Property 'Visual Tree' does not support values of type 'GridColumn'
。
答案 0 :(得分:3)
根据您发布的代码,它看起来(即使您没有提及),您正在使用DevExpress'GridControl。
如果是,则您具有ColumnSource
属性,您可以在其中绑定表示列的对象列表(不一定是GridColumn
个对象)。
此链接比我更好地解释了它:https://documentation.devexpress.com/#WPF/CustomDocument10121但总结一下:
GridColumn
。如果您使用MVVM,则应该在ViewModel上,因此使用GridColumn
不是明智的)存储创建GridColumn
所需的数据并将其分配给ColumnsSource
上的GridControl
属性DataTemplate
(如果您需要不同的列类型,则为几个),根据您对象中的数据模板GridColumn
(如果您的对象已经是GridColumn
它是再次定义它的问题,但这是强制性的)DataTemplateSelector
后代,它选择(通过覆盖SelectTemplate
函数)要应用哪个模板(如果你只有一个,你可以在没有任何其他逻辑的情况下返回那个模板)并分配它到ColumnGeneratorTemplateSelector
GridControl
属性
醇>
这一切都在上面的链接中解释过,并且会在这里做出太长的答案,但希望能让你开始
DevExpress在其演示的MVVM
部分有样本,文档相当不错。
除了模板选择器,它都可以在XAML中完成
所以,一旦你有这个,只需要为每个GridControl
的{{1}}属性分配相同的“列定义对象”列表,你可以将它分享给尽可能多的网格控件你想要的。
自从我这么做以来已经有很长一段时间,但是看着我的旧资料,如果您只是将ColumnsSource
集合提供给GridColumn
属性,则可能不需要使用一个模板选择器。我记得这是不可能的(虽然到那时我测试了很多组件套件并且在一些组件套件中是不可能的),但我看到它在我自己的代码中完成,并且在我选择{{{ 1}}
答案 1 :(得分:0)
我认为在library("grid")
library("ggplot2")
df <- data.frame(x=c(1:10,1:10),y=c(1:10,1001:1010),condition=rep(c("A","B"),each=10))
g <- rectGrob(gp=gpar(fill="black"))
p <- ggplot(df, aes(x=x,y=y)) + geom_line() + facet_wrap(~ condition, scales="free_y")
p + geom_rect(xmin=3,xmax=7,ymin=0.56,ymax=1,colour="black", fill="black")
g <- rectGrob(gp=gpar(fill="black"))
p + annotation_custom(g, xmin=3, xmax=7, ymin=0, ymax=1 )
p + annotation_custom(g, xmin=unit(3, "native"), xmax=unit(7,"native"),ymin=unit(0,"npc"),ymax=unit(1,"npc") )
上使用AutoGenerateColumns="True"
将是您的最佳选择