现在的位置: 首页 > 综合 > 正文

Silverlight中使用MVVM(7):DataGrid中触发Button的Click事件

2012年09月24日 ⁄ 综合 ⁄ 共 1651字 ⁄ 字号 评论关闭

            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

抱歉!评论已关闭.