是否可以在 RelayCommand 中设置 e.Handled = true?
Is it possible to set e.Handled = true in a 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
。不使用后面的代码是否可以做到这一点?
我假设您正在使用 MVVM,并且理想情况下您希望能够 'handle' 在 ViewModel 而不是在 View 中单击超链接 - 这是执行此操作的正确方法.
您可能最好使用普通的 WPF 按钮,该按钮的样式看起来像超链接,然后将按钮的命令 属性 绑定到 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>
应用样式并绑定命令 属性,这需要您将包含 control\view 的 DataContext 绑定到 ViewModel。正如我所说,如果你正在做 MVVM,这应该是显而易见的:
<Button Style="{StaticResource HyperLinkButton}"
Content="Some Link"
Command={Binding Path=MyCommand, Mode=OneWay/>
所以我有一个超链接,我已经像这样连接到后面的代码:
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
。不使用后面的代码是否可以做到这一点?
我假设您正在使用 MVVM,并且理想情况下您希望能够 'handle' 在 ViewModel 而不是在 View 中单击超链接 - 这是执行此操作的正确方法.
您可能最好使用普通的 WPF 按钮,该按钮的样式看起来像超链接,然后将按钮的命令 属性 绑定到 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>
应用样式并绑定命令 属性,这需要您将包含 control\view 的 DataContext 绑定到 ViewModel。正如我所说,如果你正在做 MVVM,这应该是显而易见的:
<Button Style="{StaticResource HyperLinkButton}"
Content="Some Link"
Command={Binding Path=MyCommand, Mode=OneWay/>