1

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

我的按钮需要三个不同的内容:“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 中做同样的事情吗?

4

2 回答 2

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>

但是您仍然必须以某种方式更改标签值。也许使用 EventTrigger,但我不知道如何。

于 2013-06-23T14:16:21.257 回答
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。

于 2013-06-23T15:05:53.317 回答