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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM