我在 WPF 应用程序中有一个用于登录目的的按钮控件。 该按钮具有双重用途:注销时,它应显示文本"登录"。 登录时,它将显示文本"注销"。
我可以通过将数据绑定到视图模型中的适当字符串属性来做到这一点。 但是,如果我能简单地将数据绑定到"登录"布尔值(假表示注销,真表示登录(,然后决定从视图中在按钮上显示哪些文本,那就更整洁了。
这可能吗?
可以使用Xaml
中的Style
来实现它,而无需编写特定的 C# 代码。
假设您在ViewModel
IsLoggedIn
属性正在按钮绑定命令的执行方法上更改:
private void MyButtonCommandExecuteMethod()
{
this.IsLoggedIn = !this.IsLoggedIn;
}
private bool isLoggedIn;
public bool IsLoggedIn
{
get
{
return this.isLoggedIn;
}
set
{
this.isLoggedIn = value;
OnPropertyChanged(nameof(IsLoggedIn));
}
}
在上面的代码中,OnPropertyChanged
是INotifyPropertyChanged
PropertyChanged
事件的方法实现。如果使用任何框架或定义自己的名称,请将其替换为适当的名称。
您可以定义如下样式:
<Button Command="{Binding YourButtonCommand}">
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Content" Value="Log In" />
<Style.Triggers>
<DataTrigger Binding="{Binding IsLoggedIn}" Value="True">
<Setter Property="Content" Value="Log out" />
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
在上面的代码中,IsLoggedIn
绑定到DataTrigger
,以根据Button
的值更新其Content
属性。
另一点,按钮样式继承自默认样式。如果您有任何键控样式,请在BasedOn
属性中使用它。
解决方案
是的,可以使用值转换器,特别是IValueConverter
.您可以使用这样的转换器将bool
属性(例如BoolProperty
从viewmodel
绑定到button
。
<Button Content="{Binding BoolProperty, Converter={StaticResource BoolConverter}}" />
第1步: 您需要创建一个转换器,该转换器将接受布尔值并根据需要返回任何字符串。
public class BoolConverter : System.Windows.Data.IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool)
{
return value.ToString();
}
return null;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
步骤 2:将此转换器声明为 XAML 中的资源(需要定义local
命名空间别名,该别名在<Window ..>
start 元素中包含转换器。
<local:BoolConverter x:Key="BoolConverter" />
所以现在每当为BoolProperty
引发属性更改事件时,都会触发此转换器,并且button
文本将相应更改。
建议:
我不确定为什么你认为维护额外的string
财产不是一种干净的方式。它很干净,比使用转换器更简单。IMO,无论我所展示的是什么,都是您的案件不必要的开销。但是,既然你问了可能性,我就详细说明了。选择权在你!:)