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.如何取舍就由各位自己分析比較吧.