我的ViewModel中有一个名为IsConnected
的bool属性,我想将它绑定到MainWindow中的TextBlock。我不需要将文本块设为true
或false
,而是需要它来代替Connected
或Disconnected
。原谅我,因为我是WPF的新手。如果有人能给我一个良好的开端,我可以从那里拿走它,但我不知道如何弄清楚我需要什么。
答案 0 :(得分:4)
最简单的方法可能是创建一个自定义转换器,将bool值转换为字符串。在任何地方搜索IValueConverter和/或WPF。
public class BoolToConnectedConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
if((bool)value)
return "Connected";
else
return "Disconnected";
}
public object ConvertBack(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
#endregion
}
添加xmlns:
xmlns:converter="clr-namespace:MyProjectNameSpace"
将资源添加到XAML(更改为所需的任何元素)
<Window.Resources>
<converter:BoolToConnectedConverter x:Key="connectedConverter" />
</Window.Resources>
在XAML中:
<TextBlock Text={Binding IsConnected, Converter={StaticResource connectedConverter}" />
答案 1 :(得分:2)
我通常更喜欢只在视图模型中添加一个属性(我真的不喜欢值转换器),但这是一个简单的方法来完成你尝试使用样式做的事情:
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text" Value="Connected"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="False">
<Setter Property="Text" Value="Disconnected"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
修改强>
请注意,一旦习惯使用数据触发器,就可以对视图进行各种修改,而无需触及视图模型。例如:
<StackPanel>
<Image Source="images\connected.png">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<Image Source="images\disconnected.png">
<Image.Style>
<Style TargetType="Image">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsConnected}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
</StackPanel>
答案 2 :(得分:1)
使用ViewModel,编写两个属性包,并通知不动产中的更改。
因此,每当更改值时,字符串表示将更新并绑定到控件,而您仍然可以在代码中使用bool属性。
public string IsConnectedStr{
get{
return IsConnected?"Connected":"Disconnected";
}
}
public bool IsConnected{
get{
return _isConnected;
}
set{
_isConnected=value;
PropertyChanged("IsConnected");
PropertyChanged("IsConnectedStr");
}
}
答案 3 :(得分:0)
你可以用两种方式做到这一点
1)写一个转换器
2)更改ViewModel中的函数,使其返回所需的字符串而不是bool
最简单的方法是#2,但是如果你真的需要在你的代码中的其他地方使用bool值,你可以使用#1(谷歌转换器和wpf)
答案 4 :(得分:0)
看看价值转换器。
http://www.wpftutorial.net/ValueConverters.html
public class BoolToConnectedConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var isConnected = (bool)value;
return isConnected ? "Connected" : "Disconnected";
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException("Not required for read-only values");
}
}
在您的XAML中:
<Window.Resources>
<l:BoolToConnectedConverter x:Key="boolToConnectedConverter" />
</Window.Resources>
<Grid>
<Label Content="{Binding IsConnected, Converter={StaticResource boolToConnectedConverter}}" />
</Grid>