我有一个使用MVVM模式(MVVM Light Toolkit)在WPF中开发的应用程序。
到目前为止,我没有遇到任何问题,直到在运行时更改与我的一些控件(一组MenuItem)相关的样式。(最多可以有三种不同的风格)。
如果我没有使用MVVM,我可以使用以下命令解决它:
MenuElement_Left4.Style = (Style)FindResource("MenuButtonTabsLeft");
但是因为我想完全在MVVM中实现它,所以我做了这些测试来实现:
1)尝试使用绑定更改样式(此操作不起作用):
<MenuItem x:Name="MenuElement_Left4" Header="Test" Style="{Binding SelectedStyle}">
在ViewModel中:
public string SelectedStyle
{
get { return this.selectedStyle; }
set { this.selectedStyle = value;
RaisePropertyChanged("SelectedStyle");
}
}
private string selectedStyle;
2)使用DataTrigger更改样式(这也不起作用。引发异常(Style Trigger to Apply another Style)):
<MenuItem.Style>
<Style TargetType="{x:Type MenuItem}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=TestStyle}" Value="True">
<Setter Property="Style" Value="{StaticResource MenuButtonTabsLeftArrow}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=TestStyle}" Value="False">
<Setter Property="Style" Value="{StaticResource MenuButtonTabsLeft}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</MenuItem.Style>
最后,我设法解决了这个问题,使用下面的代码使用ComboBox(我只使用ComboBox来更改MenuItem的样式,使其不可见)。从(How can I change an elements style at runtime?)得到的想法:
<MenuItem x:Name="MenuElement_Left4" Header="Test" Style="{Binding ElementName=AvailableStyles, Path=SelectedItem.Tag}">
<ComboBox Name="AvailableStyles" SelectedIndex="{Binding AvailableStylesIndex}" Visibility="Collapsed">
<ComboBoxItem Tag="{x:Null}">None</ComboBoxItem>
<ComboBoxItem Tag="{StaticResource MenuButtonTabsLeftArrow}">MenuButtonTabsLeftArrow</ComboBoxItem>
<ComboBoxItem Tag="{StaticResource MenuButtonTabsLeft}">MenuButtonTabsLeft</ComboBoxItem>
</ComboBox>
在我的ViewModel中:
public int AvailableStylesIndex
{
get { return this.availableStylesIndex; }
set
{
this.availableStylesIndex = value;
RaisePropertyChanged("AvailableStylesIndex");
}
}
我宁愿用更干净的方式。有什么建议吗?一段代码会很有帮助。
1条答案
按热度按时间jv2fixgn1#
由于您将样式保存在资源中,因此更干净的方法是使用IMultiValueConverter的第一种方法,如下所示:
ViewModel
Xaml:
在转换器中找到你想要的样式并应用它
摘自Steven Robbins在this post中的回答