WPF MVVM模式下 c1:C1FlexGrid如何绑定事件和ContextMenu
本帖最后由 jacky_zh 于 2016-6-28 16:20 编辑我原控件代码如下:
希望换成 c1:C1FlexGrid 代码如下,结果Triggers 和 ContextMenu都失效了,不知应该怎么使用?
ContextMenu直接通过XAML代码就可以设置
<c1:C1FlexGrid >
<c1:C1FlexGrid.ContextMenu>
<ContextMenu>
<MenuItem>abc</MenuItem>
</ContextMenu>
</c1:C1FlexGrid.ContextMenu>
</c1:C1FlexGrid>
</Grid>
Trigger也是可以使用的。
你提到失效了,是出现了什么异常,最好提供一个可以重现的Demo,我帮你看看。 本帖最后由 jacky_zh 于 2016-6-29 10:44 编辑
我已经测试出 header属性不能 绑定 方法
Header="{Binding Converter={StaticResource T}, ConverterParameter=DatabaseLeft#StrEditRecordName}" 这样 不能正常显示控件
其次是 command方法不能绑定 viewmodel里的事件,绑定后会导致不能显示控件。
Command="{Binding EditRecordNameClickCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget}"
去掉这个个属性可以正常显示。
但是这2个属性都是我这必须要使用属性。
参考代码如下:
<c1:C1FlexGrid.ContextMenu>
<ContextMenu Visibility="{Binding AllVisibility, Mode=TwoWay}" FontFamily="Arial">
<MenuItemHeader="Edit RecordName" Name="EditRecordName"
Visibility="{Binding EditRecordNameVisibility, Mode=TwoWay}"
Command="{Binding EditRecordNameClickCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget}"/>
<MenuItemHeader="ViewData" Name="ViewData"/>
</ContextMenu>
</c1:C1FlexGrid.ContextMenu> 进一步测试 是CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget}" 导致不能显示控件,但是参数该如何传递? jacky_zh 发表于 2016-6-29 10:50
进一步测试 是CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorTy ...
谢谢反馈。
您的CommandParameter参数需要传递什么?
ContextMenu是它自身视觉树的根节点,所以通过RelativeSource.FindAncestor就找不到FlexGrid。另:ContextMenu有其自身的视觉树并且它不是FlexGrid视觉树的一部分。
最好能将你出问题的Demo发过来,我们才能快速的定位帮你看看。
<MenuItem >绑定事件的问题已经解决。谢谢alice。
column中header属性不能绑定转换器的问题,有没有提示,或者例子
Header="{Binding Converter={StaticResource T}, ConverterParameter=DatabaseLeft#StrEditRecordName}"
jacky_zh 发表于 2016-6-30 15:25
绑定事件的问题已经解决。谢谢alice。
column中header属性不能绑定转换器的问题,有没有提示,或者例子
H ...
ContextMenu本身是微软的控件,你可以搜下ContextMenu相关知识。
如果是产品上出问题,麻烦给一个Demo,我帮你看看是否有问题,如何解决。 ContextMenu控件使用没问题了,他的<MenuItem >的header也是可以 Header="{Binding Converter={StaticResource T}, ConverterParameter=DatabaseLeft#StrEditRecordName}" 的。
Flexgrid的column的header属性不行,http://chuantu.biz/t5/13/1467337926x2728329205.png 本帖最后由 Alice 于 2016-7-1 10:17 编辑
jacky_zh 发表于 2016-7-1 10:05
ContextMenu控件使用没问题了,他的的header也是可以 Header="{Binding Converter={StaticResource T}, Con ...
谢谢您提供的代码。
通过XAML来做Header属性的binding是不行的,因为它不是dependency property。
如果想要绑定Header Cell并且自定义它,需要使用C1FlexGrid提供的CellFactory功能。
代码参考:
<p>//1.先设置c1flexgrid的CellFactory
c1flexgrid1.CellFactory = new MyCellFactory();</p><p>
//2.重写CellFactory的CreateColumnHeaderContent方法
public class MyCellFactory:CellFactory
{
public override void CreateColumnHeaderContent(C1FlexGrid grid, Border bdr, CellRange range)
{
base.CreateColumnHeaderContent(grid, bdr, range);
TextBlock tb = new TextBlock();
Binding Bd = new Binding();
Bd.Path = new PropertyPath("ColumnName");
tb.SetBinding(TextBlock.TextProperty, Bd);
bdr.Child = tb;
}
}
</p>
页:
[1]