触发多次更改按钮内容

时间:2013-06-23 13:21:16

标签: c# wpf triggers

我有一个用于排序的按钮。我可以轻松设置代码隐藏中的内容更改,但这是一种肮脏的方法。我知道有触发器可以执行此任务,但我发现的有关它们的所有信息都是针对单一行为(鼠标结束时颜色变化等)。

我的按钮需要三个不同的内容:“ABC”,“ZYX”和“默认”。

我用这种方式完成了代码隐藏:

int SortState = 0;
     private void sortButton_Click(object sender, RoutedEventArgs e)
    {
        SortState ++;
        if (SortState == 3)
        {
            SortState = 0;
        }
         switch (SortState )
         {
             case 0:
                     {
                         sortButton.Content = "ABC";
                          break;
                     }
             case 1:
                     {
                         sortButton.Content = "ZYX";
                         break;
                     }
             case 2:
                     {
                         sortButton.Content = "Default";
                         break;
                     }
         }

    }

有人可以给我一些暗示如何在XAML中做同样的事情吗?

2 个答案:

答案 0 :(得分:1)

这是我尝试过的。

<Style.Triggers>       
    <Trigger Property="Tag" Value="0">
        <Setter Property="Content" Value="Default" />
    </Trigger>

    <Trigger Property="Tag" Value="1">
        <Setter Property="Content" Value="XYZ" />
    </Trigger>

    <Trigger Property="Tag" Value="2">
        <Setter Property="Content" Value="ABC" />
    </Trigger>
</Style.Triggers>

但仍然需要以某种方式更改Tag值。也许使用EventTrigger,但我不知道如何。

答案 1 :(得分:1)

使用MVVM的替代解决方案:

在ViewModel中创建一个存储SortState

的属性
    public int SortState
    {
        get { return _sortState; }
        set
        {
            _sortState = value;
            RaisePropertyChanged("SortState");
        }
    }

在ViewModel中创建一个命令来处理按钮点击:

    public ICommand SortStateCommand
    {
        get
        {
            if (_sortStateCommand == null)
                _sortStateCommand = new RelayCommand(() =>
                    {
                        SortState++;
                        if (SortState == 3)
                            SortState = 0;
                    });
            return _sortStateCommand;
        }
    }

创建转换器以将SortState转换为文字:

public class SortStateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var val = (int) value;
        var returnVal = string.Empty;
        switch (val)
        {
            case 0:
                returnVal = "ABC";
                break;
            case 1:
                returnVal = "ZYX";
                break;
            case 2:
                returnVal = "Default";
                break;
        }
        return returnVal;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

在视图中将它们连接在一起:

<Window.Resources>
    <wpfApplication1:SortStateConverter x:Key="SortConverter"/>
</Window.Resources>

<Button Content="{Binding SortState, Converter={StaticResource SortConverter}}"
        Command="{Binding SortStateCommand}">
</Button>

RelayCommand实现来自MVVMLight。