这感觉就像一个非常基本的问题,但我相信有更好的方法来做到这一点.我有一个Button在我的UI,其选择特定的标签,火灾Command从ViewModel
这是当前的代码(工作正常):
XAML:
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}" />
Run Code Online (Sandbox Code Playgroud)
代码背后:
private void OnButtonClick(object sender, RoutedEventArgs e)
{
theTab.IsSelected = true;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何更清洁,仅限XAML的方式来进行UI操作?我在考虑这样的事情:
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}">
<Button.Triggers>
<EventTrigger RoutedEvent="Click">
<Setter TargetName="theTab" Property="IsSelected" Value="True" />
</EventTrigger>
</Button.Trigger>
</Button>
Run Code Online (Sandbox Code Playgroud)
但不幸的是,它似乎EventTrigger不会支持一个Click事件.为什么这样?在WPF工作几年后,我仍然有时会对触发器感到困惑,这几乎总结了它.在尝试构建时,我Setter在行上有错误:
A value of type 'Setter' cannot be added to a collection or dictionary of type 'TriggerActionCollection'.
Run Code Online (Sandbox Code Playgroud)
谢谢!
编辑,因为我问我的窗口的XAML结构,它看起来像这样:
<DockPanel LastChildFill="True">
<Ribbon DockPanel.Dock="Top">
<Button Content="Button!" Click="OnButtonClick" Command="{Binding WhateverCommand}" />
</Ribbon>
<TabControl>
<TabItem x:Name="theTab" />
</TabControl>
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
错误总结了它.您不能使用Setter在EventTrigger.如果你想在XAML中这样做,你可以使用它在Storyboard按下按钮时选择给定的选项卡.像这样的东西:
<Button Content="Click">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames Storyboard.TargetName="theTab" Storyboard.TargetProperty="IsSelected">
<DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="True"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Button.Triggers>
</Button>
Run Code Online (Sandbox Code Playgroud)
肯定有更好的方法。在程序集的帮助下,Windows.Interactivity您可以将事件源绑定到仅包含关联操作的单个类。有了这个,你几乎可以做你需要的一切。
操作类必须从 TriggerAction 派生。通过覆盖Invoke-method,您可以指定操作。
尽管存在这种情况,也可以将其绑定EventTrigger到命令(例如中继命令),从而允许干净的 MMVM 实现。
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<Button x:Name="button">
<i:Interaction.Triggers>
<i:EventTrigger SourceName="button" EventName="Click">
<app:MyAction/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
Run Code Online (Sandbox Code Playgroud)
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
<Button x:Name="button">
<i:Interaction.Triggers>
<i:EventTrigger SourceName="button" EventName="Click">
<app:MyAction/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
Run Code Online (Sandbox Code Playgroud)
我更新了代码以满足您的特定要求。该类TriggerAction现在还包含一个依赖属性,可以将其添加到您的选项卡控件:
<TabControl x:Name="tab"/>
<Button x:Name="button">
<i:Interaction.Triggers>
<i:EventTrigger SourceName="button" EventName="Click">
<app:MyAction Target="{Binding ElementName=tab}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
Run Code Online (Sandbox Code Playgroud)
Public Class MyAction
Inherits Interactivity.TriggerAction(Of UIElement)
Protected Overrides Sub Invoke(parameter As Object)
MsgBox("Clicked")
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
43175 次 |
| 最近记录: |