我有一个用于排序的按钮。我可以轻松设置代码隐藏中的内容更改,但这是一种肮脏的方法。我知道有触发器可以执行此任务,但我发现的有关它们的所有信息都是针对单一行为(鼠标结束时颜色变化等)。
我的按钮需要三个不同的内容:“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中做同样的事情吗?
答案 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。