[英]How to change the style of a button based on if else using DataTriggers in wpf mvvm
我想在第一次加載wpf應用程序時根據if else條件更改按鈕的樣式。 在使用if加載的應用程序中,將有一種樣式的按鈕,而在其他部分中,將有另一種樣式。 如何使用Datatriggers或使用MVVM模式實現此目的。
請建議?
謝謝
您可以使用Style.Setters
設置默認值。 對於其他確定的條件,請使用Style.Triggers
。 這就像if else一樣。
<TextBlock.Style>
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=EditorWindow, Path=Category}" Value="R">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
<Style.Setters>
<Setter Property="Visibility" Value="Collapsed"/>
</Style.Setters>
</Style>
</TextBlock.Style>
或者,如果要使用DataTriggers,可以使用以下命令:
<Button Command="{Binding SomeButtonCommand}" Content="Click Me!">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=NormalButtonMode, Mode=OneWay}" Value="True">
<Setter Property="Content" Value="This Button is in Normal Mode" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=NormalButtonMode, Mode=OneWay}" Value="False">
<Setter Property="Content" Value="This Button is in the Other Mode" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
在這種情況下,ViewModel必須公開布爾屬性NormalButtonMode。 在此示例中,我僅設置按鈕的Content屬性,但您可以在DataTrigger中列出任意數量的Setter。 您還可以將此Style放在資源字典中,並使用StaticResource將其鏈接到每個按鈕。 只需確保在每個ViewModel上公開NormalButtonMode(或其他)屬性 - 也許將它放在基類中。
您應該查看數據模板和模板選擇器。 這是我自己的代碼中的草率復制粘貼示例,它不是立即適用於按鈕,但我認為它應該幫助您一路走來。
以下是來自應用程序資源的xaml文件。 我使用它來根據ViewModel中的變量決定用於ProjectViewModel的視圖:
<DataTemplate DataType="{x:Type viewmod:ProjectViewModel}">
<DataTemplate.Resources>
<DataTemplate x:Key="ProjectEditViewTemplate">
<view:ProjectEditView/>
</DataTemplate>
<DataTemplate x:Key="ServiceSelectionViewTemplate">
<view:ServiceSelectionView/>
</DataTemplate>
</DataTemplate.Resources>
<ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource ProjectViewModelTemplateSelector}" />
</DataTemplate>
ProjectViewModelTemplateSelector定義如下:
public class ProjectViewModelTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null && item is ViewModel.ProjectViewModel)
{
if ((item as ViewModel.ProjectViewModel).EditMode)
{
return element.FindResource("ProjectEditViewTemplate") as DataTemplate;
}
else
{
return element.FindResource("ServiceSelectionViewTemplate") as DataTemplate;
}
}
else
return base.SelectTemplate(item, container);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.