MVVM模式中具有超链接使用的单元模板

时间:2013-03-04 14:24:11

标签: wpf xaml mvvm hyperlink icommand

我想在DataGrid中插入一个超链接并找到一个方法,以便使用MVVM模式实现RequestNavigate行为。

到目前为止,我已经尝试了很多解决方案,但它们都没有奏效。你能帮帮我吗?

这是我的xaml代码:

<dgWPFCtrl:ExtDataGridTemplateColumn  Header="Link to XXX"  Width="*">
                    <dgWPFCtrl:ExtDataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock >
                                <Hyperlink NavigateUri="{Binding Path=ID_HTTP_LINK}"
                                           >
                                    <TextBlock Text="{Binding Path=ID_HTTP_LINK}"/>
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="RequestNavigate">
                                            <WPFCtrl:EventToCommand 
                                                PassEventArgsToCommand="True"
                                                Command="{Binding Path=OpenLinkCommand}" />
                                        </i:EventTrigger>
                                    </i:Interaction.Triggers>
                                </Hyperlink>
                            </TextBlock>
                        </DataTemplate>
                    </dgWPFCtrl:ExtDataGridTemplateColumn.CellTemplate>
                </dgWPFCtrl:ExtDataGridTemplateColumn>

并遵循相对ICommand开发:

//Command for open link
RelayCommand _openLinkCommand;
public ICommand OpenLinkCommand
{
    get
    {
        if (_openLinkCommand == null)
            _openLinkCommand = new RelayCommand(param => 
            {
                //Command Body ...
            });
        return _openLinkCommand;
    }
}

我哪里错了?出乎意料的是,ICommand甚至从未被召唤过!

我也尝试过使用其他类型的活动(例如MouseEnter),但没有改变!

提前感谢您的贡献,

代比

1 个答案:

答案 0 :(得分:11)

Hyperlink的DataContext是DataGridRow表示的对象,而不是ViewModel。因此,您必须使用绑定方法来访问ViewModel(RelativeSource AncestorType或ElementName)。

ElementName(假设您的DataGrid名为&#39; myDataGrid&#39;)

Command="{Binding ElementName=myDataGrid, Path=DataContext.OpenLinkCommand}"

<强>的RelativeSource

Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.OpenLinkCommand}"