我坚持"简单"转换。我有一个方法。它检查连接。如果建立了连接,则更改我的viewmodel的boolean属性。我想要做的是在我的表单上显示彩色字符串(红色"连接失败"或绿色"建立连接"取决于布尔属性)但我不喜欢&#39 ;不知道该怎么做。
答案 0 :(得分:6)
这里有两个选项,因为您没有提供任何特定代码,我将只提供一些资源:
第一个选项是使用触发器更新文本的属性。这将在xaml中实现,只需观察绑定属性以获取特定值(在您的情况下为true或false)并相应地更新颜色。这也是@Kylo-Ren所做的。 有关这方面的信息可以在这里找到:
http://www.wpf-tutorial.com/styles/trigger-datatrigger-event-trigger/
另一个选项是使用IValueConverter
接口并将布尔值转换为颜色。这就是@Stefan所做的。更多信息:
http://www.codeproject.com/Tips/868163/IValueConverter-Example-and-Usage-in-WPF
如果你只有一个非常有限的属性可以采用的值和/或你想一次更新多个视觉属性,我会推荐第一个版本。
第二个版本更适合更复杂的转换(例如将完整对象转换为格式化字符串),但不能轻易用于更新多个视觉属性。
经验法则:
我想指出一个州=>使用触发器
我想以特定方式显示对象值(例如Text)=>使用IValueConverter
答案 1 :(得分:5)
使用以下(更改控件类型与您正在使用的):
<TextBox Text="content" >
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<DataTrigger Binding="{Binding ConnectionStatus}" Value="true">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding ConnectionStatus}" Value="false">
<Setter Property="Background" Value="Green"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
答案 2 :(得分:2)
最好的方法是使用IValueConverter进行绑定。只需实现新的转换器类:
public class BoolToColorConverter : IValueConverter
{
object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var val = (bool) value;
// your convertion logic here
// return Brushes.Black;
}
object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
接下来,将您的转换器添加到XAML中的资源:
<Window.Resources>
<l:BoolToColorConverter x:Key="boolToColorConverter" />
</Window.Resources>
并在数据绑定中使用它:
<TextBox Background="{Binding YourBoolPropertyName,
Converter={StaticResource boolToColorConverter}}" />
您可以阅读有关转化器here的更多信息。
答案 3 :(得分:1)
<TextBlock Text="{Binding MyBoolValue,Converter={StaticResource MyConverter,ConverterParameter=Text}}" Foreground="{Binding MyBoolValue,Converter={StaticResource MyConverter,ConverterParameter=Color}}"/>
。
上述解决方案不完整,仅显示基础知识。如果您遇到困难,请随时提出其他问题。
答案 4 :(得分:0)
虽然已经发布了Converter,但我创建了一个更可重用的BooleanToColorConverter。您可以将它用于不同的场景,如下所示。
[ValueConversion(typeof(bool), typeof(SolidColorBrush))]
public class BooleanToColorConverter : IValueConverter
{
public Brush TrueBrush { get; set; }
public Brush FalseBrush { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var boolValue = value as bool? ?? true;
if (parameter != null && parameter.ToString() == "!")
{
boolValue = !boolValue;
}
if (boolValue)
{
return TrueBrush;
}
return FalseBrush;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
现在在资源的XAML中你可以有这样的东西:
<ResourceDictionary>
<converter:BooleanToColorConverter x:Key="BooleanToColorConverter" FalseBrush="#4CFF0000" TrueBrush="#4C00FF00" />
<converter:BooleanToColorConverter x:Key="ReadOnlyToColorConverter" TrueBrush="LightGray"/>
</ResourceDictionary>
现在你可以像这样在Background属性上使用它(IsReadOnly是Type bool的属性):
Background="{Binding IsReadOnly, Converter={StaticResource ReadOnlyToColorConverter}}"
PS。这段代码:
if (parameter != null && parameter.ToString() == "!")
{
boolValue = !boolValue;
}
只是为了你可以在需要时轻松反转你的颜色。您可以像这样使用它:
Background="{Binding IsReadOnly, Converter={StaticResource ReadOnlyToColorConverter}, ConverterParameter=!}"
答案 5 :(得分:-1)
您可以创建名为ConnectionStatusColor的SolidColorBrush
属性。在它的获取中,您可以执行以下操作:
return connectionSuccess ? Brushes.Green : Brushes.Red
不要忘记实施INotifyPropertyChanged
,以便应用绑定。
或者您可以创建IValueConverter并在绑定中使用它。
class BoolToBrushConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool) value ? Brushes.Green : Brushes.Red;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}