zoukankan      html  css  js  c++  java
  • Silverlight中使用MVVM(7):DataGrid中触发Button的Click事件

                Silverlight中使用MVVM(1)--基础

                Silverlight中使用MVVM(2)—提高

                Silverlight中使用MVVM(3)—进阶

                Silverlight中使用MVVM(4)—演练

                Silverlight中使用MVVM(5)-Command II

                Silverlight中使用MVVM(6):AutoComplteBox的异步过滤

            毕业后忽然觉得什么地方都要用钱, 这半年除了工作,几乎没有什么时间静下心来分享一些东西了,生活压力山大啊.

            这篇文章分享MVVM中常见的一个问题,相信在实际运用MVVM的朋友一定会遇到这种问题. 

       <sdk:DataGridTemplateColumn Header="功能"  Width="Auto">
         <sdk:DataGridTemplateColumn.CellTemplate>
             <DataTemplate >
                 <StackPanel Orientation="Horizontal">
                     <Button Content="删除" Margin="10,0" Command="{Binding ShowCommand}"  Height="24" 
                            HorizontalAlignment="Left" VerticalAlignment="Center" >
                     </Button>
                 </StackPanel>
             </DataTemplate>
         </sdk:DataGridTemplateColumn.CellTemplate>
      </sdk:DataGridTemplateColumn>

           在CellTemplate中的Button与ViewModel中的Command属性绑定时.你会发现Button无法触发这个事件      

          如何处理这种情况呢,我的做法是这样的:

       public class DataContextProxy:TriggerAction<DependencyObject>
      {
          protected override void Invoke(object parameter)
          {
              var parent = this.AssociatedObject as DependencyObject;
              var fe = this.AssociatedObject as FrameworkElement;
              while (parent != null)
              {
                  if (parent.GetType() == typeof(DataGrid))
                  {
                      var context = parent as DataGrid;
                      fe.DataContext = context.DataContext;
                      break;
                  }
                  parent = VisualTreeHelper.GetParent(parent) as DependencyObject;
              }
     
          }
      }
       

           继承一个TriggerAction,具体的原理就不叙述了,Button引用这个TriggerAction ,不要忘了System.Windows.Interactivity这个dll噢^^

          <Button Content="删除" Margin="10,0" Command="{Binding ShowCommand}"  Height="24" 
                HorizontalAlignment="Left" VerticalAlignment="Center" >
                  <i:Interaction.Triggers>
                      <i:EventTrigger>
                          <local:DataContextProxy/>
                      </i:EventTrigger>
                  </i:Interaction.Triggers>
          </Button>

            这样就可以了.另外一种方式可以参考:stackOverFlow.如何取舍就由各位自己分析比较吧.

           示例下载:DataGridWithButton.rar

  • 相关阅读:
    获取网站IP地址(Linux,C)
    linux_c_udp_example
    linux_c_tcp_example
    golang-sort
    docker_jenkins
    依赖抽象,而不要依赖具体实现
    网络杂记
    游戏开发中遇到的问题
    随手杂记
    go多态
  • 原文地址:https://www.cnblogs.com/626498301/p/2335439.html
Copyright © 2011-2022 走看看