簡體   English   中英

如何在wpf mvvm中使用DataTriggers基於if else更改按鈕的樣式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM