目前我有一套ToggleButtons。 我想根据选中的按钮显示我的TabControl的不同Tab。基本上相同的bahaviour就像选择了不同的Tab一样。不确定我的需求是否无稽之谈。我希望SelectedTab根据单击的按钮进行更改。此外,我的ToggleButtons是固定到Togglebuttons的RadioButtons(我只希望一次检查一个)。我想尝试仅在XAML中实现我的需求(如果可能的话)。
所以这是我的XAML的一部分:
<Window.Resources>
<sys:Int32 x:Key="CurrentTab"></sys:Int32>
<Style TargetType="RadioButton" BasedOn="{StaticResource {x:Type ToggleButton}}">
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="Aqua"></Setter>
</Trigger>
</Style.Triggers>
<Setter Property="Background" Value="Transparent"></Setter>
</Style>
</Window.Resources>
<TabControl Grid.Row="1"
Grid.Column="1"
Grid.ColumnSpan="2"
SelectedIndex="{StaticResource CurrentTab}">
<TabItem Visibility="Collapsed"></TabItem>
<TabItem Visibility="Collapsed"></TabItem>
</TabControl>
我在想的是(pseudoCode):
<Setter Target="{StaticResource CurrentTab}" Value="{ButtonsToolTip}></Setter>
基本上甚至可以为XAML中的变量赋值,如果是 - 如何?
作为一个示例,我尝试实现的原因和内容类似于此GUI:
答案 0 :(得分:2)
您无法使用xaml更改声明为资源的基本类型的值。但是您可以使用对象的属性作为变量。例如;
<sys:Int32 x:Key="IntKey">12</sys:Int32>
使用XAML是不可修改的。但是,DictionaryEntry的Value属性(如下所示)是可修改的,尽管像int(IntKey)一样,DEKey也是不可修改的。
<coll:DictionaryEntry x:Key="DEKey" Key="TagKey" Value="100"/>
如果我尝试通过绑定更改整数(IntKey),它就不会允许。例如; <TextBox Text="{Binding Mode=OneWay,Source={StaticResource IntKey}}"/>
,模式必须是OneWay。 TwoWay,不允许OneWayToSource值。
但我可以写
<TextBox Text="{Binding Value,Source={StaticResource DEKey}}"/>
,任何文本框值都将在DictionaryEntry(DEKey)的值中更新。注意,双向绑定不起作用,因为DictionaryEntry不是DependencyObject。但您现在可以按照自己喜欢的方式更改变量(Value属性)。但唯一值得关注的是:对Value属性的更改不会反映在有限控制中。
此Tag属性现在模仿您的变量。
<Window.Resources>
<FrameworkElement x:Key="rbTagHolder" Tag="0"/>
</Window.Resources>
...
<ItemsControl x:Name="RadioButtonList">
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton Content="{Binding TabName}" Tag="{Binding TagValue}" GroupName="Choice">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ei:ChangePropertyAction TargetObject="{DynamicResource rbTagHolder}" PropertyName="Tag" Value="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=1, AncestorType={x:Type RadioButton} }}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</RadioButton>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
...
<TabControl x:Name="TabCtrl" SelectedIndex="{Binding Tag, Source={StaticResource rbTagHolder}}"> ... </TabControl>
代码隐藏
RadioButtonList.ItemsSource = new[] { new { TabName = "Tab1", TagValue = "0" }, new { TabName = "Tab2", TagValue = "1" },
new { TabName = "Tab3", TagValue = "2" }, new { TabName = "Tab4", TagValue = "3" }};
以防您不知道如何使用混合行为。
一个。包括以下命名空间:
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
B中。添加对以下内容的引用:Microsoft.Expression.Interactions,System.Windows.Interactivity在我的系统上,这些可以在
中找到C:\ Program Files(x86)\ Microsoft SDKs \ Expression \ Blend.NETFramework \ v4.0 \ Libraries
答案 1 :(得分:1)
单独使用XAML中的事件触发器无法更改StaticResource
的值。这必须通过将StaticResource
绑定到ViewModel的属性或使用后面的代码来完成。