jacky_zh 发表于 2016-6-28 15:49:39

WPF MVVM模式下 c1:C1FlexGrid如何绑定事件和ContextMenu

本帖最后由 jacky_zh 于 2016-6-28 16:20 编辑

我原控件代码如下:


希望换成 c1:C1FlexGrid 代码如下,结果Triggers 和 ContextMenu都失效了,不知应该怎么使用?





Alice 发表于 2016-6-28 18:05:08

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:39:36

本帖最后由 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>

jacky_zh 发表于 2016-6-29 10:50:55

进一步测试 是CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}, Path=PlacementTarget}" 导致不能显示控件,但是参数该如何传递?

Alice 发表于 2016-6-29 14:34:42

jacky_zh 发表于 2016-6-29 10:50
进一步测试 是CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorTy ...

谢谢反馈。
您的CommandParameter参数需要传递什么?
ContextMenu是它自身视觉树的根节点,所以通过RelativeSource.FindAncestor就找不到FlexGrid。另:ContextMenu有其自身的视觉树并且它不是FlexGrid视觉树的一部分。

最好能将你出问题的Demo发过来,我们才能快速的定位帮你看看。

jacky_zh 发表于 2016-6-30 15:25:50

<MenuItem >绑定事件的问题已经解决。谢谢alice。
column中header属性不能绑定转换器的问题,有没有提示,或者例子
Header="{Binding Converter={StaticResource T}, ConverterParameter=DatabaseLeft#StrEditRecordName}"

Alice 发表于 2016-6-30 17:24:38

jacky_zh 发表于 2016-6-30 15:25
绑定事件的问题已经解决。谢谢alice。
column中header属性不能绑定转换器的问题,有没有提示,或者例子
H ...

ContextMenu本身是微软的控件,你可以搜下ContextMenu相关知识。

如果是产品上出问题,麻烦给一个Demo,我帮你看看是否有问题,如何解决。

jacky_zh 发表于 2016-7-1 10:05:05

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:16:17

本帖最后由 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]
查看完整版本: WPF MVVM模式下 c1:C1FlexGrid如何绑定事件和ContextMenu