是否可以在RelayCommand中设置e.Handled = true?

时间:2015-05-06 07:59:43

标签: c# wpf mvvm icommand relaycommand

所以我有一个超链接,我已经连接到背后的代码,如下所示:

的Xaml

<TextBlock x:Name="Hyperlink" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="3" FontSize="14" Foreground="White">           
      <Hyperlink NavigateUri="{Binding StreetViewString}" RequestNavigate="Hyperlink_RequestNavigate" Foreground="White" StylusDown="Hyperlink_StylusDown" TouchDown="Hyperlink_TouchDown">
             Google
      </Hyperlink>
</TextBlock> 

代码背后

private void addToDiary_MouseDown(object sender, MouseButtonEventArgs e)
{
    ((sender as Button).DataContext as MyViewModel).MyCommand.Execute(null);
    e.Handled = true;
}

但我想直接将它挂钩到正在执行的命令

    private ICommand _myCommand;
    public ICommand MyCommand
    {
        get
        {
            return _myCommand
                ?? (_myCommand= CommandFactory.CreateCommand(
                () =>
                {
                    DoSomething();
                }));
        }
    }

但唯一阻止我的是我无法从命令中设置e.Handled = true。是否可以在不使用背后的代码的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

我假设你正在使用MVVM,理想情况下你希望能够“处理”ViewModel中超链接的点击而不是View中的 - 这是正确的方法。

你可能最好使用一个普通的WPF按钮,它被设计成看起来像一个超链接,然后在按钮的Command属性中绑定到你的ICommand实例的实例。

以下应设置按钮的样式:

<Style x:Key="HyperLinkButton"
       TargetType="Button">
    <Setter
        Property="Template">
        <Setter.Value>
            <ControlTemplate
                TargetType="Button">
                <TextBlock
                    TextDecorations="Underline">
                <ContentPresenter /></TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter
        Property="Foreground"
        Value="Blue" />
    <Style.Triggers>
        <Trigger
            Property="IsMouseOver"
            Value="true">
            <Setter
                Property="Foreground"
                Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

应用Style并绑定Command属性,这要求您将包含控件\视图的DataContext绑定到ViewModel。正如我所说,如果你在做MVVM,这应该是显而易见的:

<Button Style="{StaticResource HyperLinkButton}"
        Content="Some Link"
        Command={Binding Path=MyCommand, Mode=OneWay/>