如何在wpf mvvm中使用DataTriggers来改变按钮的样式

问题描述

| 我想在第一次加载wpf应用程序时根据if else条件更改按钮的样式。在使用if加载的应用程序上,将有一种样式的按钮,在其他部分,将有另一种样式。如何使用Datatriggers或MVVM模式实现此目的。 请建议? 谢谢     

解决方法

您应该查看数据模板和模板选择器。这是我自己的代码中匆忙复制的示例,它并不立即适用于按钮,但我认为它应该对您有所帮助。 以下是来自应用程序资源的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);
    }

}
}     ,您可以使用
Style.Setters
设置默认值。对于其他确定的条件,请使用
Style.Triggers
。就像其他情况一样。
<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。 您也可以将此样式放入资源字典中,并使用StaticResource为每个按钮进行链接。只需确保在每个ViewModel上公开NormalButtonMode(或其他)属性-也许将其放在基类中即可。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...