我在我的ViewModel中有一个名为IsConnected
的布尔属性,我想将它绑定到我的MainWindow中的TextBlock。而不是让文本块读取true
或false
我需要它说Connected
或Disconnected
。原谅我,因为我是WPF的新手。如果有人能给我一个开始,我可以从那里拿走它,但我不知道如何弄清楚我需要什么。WPF数据绑定和格式化
回答
我一般宁愿只是一个属性添加到视图模型(我真的不喜欢的值转换器),但这里有一个简单的方法来完成你想使用样式做什么:
<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>
最简单的方法可能是创建一个自定义转换器,将您的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(可改变任何需要的元素)在XAML
<Window.Resources>
<converter:BoolToConnectedConverter x:Key="connectedConverter" />
</Window.Resources>
:
<TextBlock Text={Binding IsConnected, Converter={StaticResource connectedConverter}" />
请添加更多细节。 – ocodo 2010-11-18 22:24:13
我要做的唯一变化就是从字符串资源文件中检索文本。这样你就可以使它成为一个很好的通用'BoolToString'转换器,并使用转换器参数传递资源键的前缀以使用(前缀+ bool值==完整的密钥,以便从资源中检索字符串)。 – slugster 2010-11-18 22:34:48
@slugster,我同意这一点。想了一会儿,但为了简单起见,为了这个样本而放弃了它。 – ThomasAndersson 2010-11-18 22:37:06
你可以在做到这一点两种方式
1)写一个转换器
2)改变功能的视图模型,使其返回所需的字符串,而不是一个布尔
最简单的方法是#2,但如果你真的需要的布尔值在代码中的其他地方,您可以使用#1(谷歌转换器和wpf)
看看值转换器。
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>
使用视图模型,你写两个属性包裹,并通知在不动产的变化。
因此,无论何时更改值,字符串表示都会更新并绑定到控件,而您仍然可以在代码中使用bool属性。
public string IsConnectedStr{
get{
return IsConnected?"Connected":"Disconnected";
}
}
public bool IsConnected{
get{
return _isConnected;
}
set{
_isConnected=value;
PropertyChanged("IsConnected");
PropertyChanged("IsConnectedStr");
}
}
- 1. WPF使用数据绑定显示格式化多行文本
- 2. WPF绑定 - 的StringFormat - 未格式化
- 3. 格式化datagridview中的绑定数据
- 4. WPF DependencyProperty和数据绑定
- 5. WPF和数据绑定
- 6. 数据绑定WPF和vb
- 7. WPF图像格式和绑定
- 8. 在WPF和C中格式化路径中的绑定元素#
- 9. 绑定ListView和格式化数据基于价值
- 10. WPF数据绑定
- 11. 数据绑定WPF
- 12. WPF数据绑定
- 13. 数据绑定WPF
- 14. WPF数据网格动态绑定列
- 15. 动态绑定数据网格WPF
- 16. 绑定多功能WPF数据网格
- 17. ContextMenu不绑定数据网格WPF
- 18. 如何在WPF中格式化字符串并绑定格式参数?
- 19. WPF:实现和绑定(数据网格)到自定义集合
- 20. 问题样式数据绑定WPF ComboBoxItem
- 21. 数据绑定数据格式问题
- 22. 样式和绑定在WPF
- 23. 任何内置的方式来格式化WPF绑定?
- 24. WPF数据网格RowDetails - 内DataGrid绑定到外数据网格
- 25. ASP ListView - Eval()格式化的数字,绑定()为未格式化?
- 26. 使用绑定格式化
- 27. 格式化绑定属性
- 28. 杭大数据量的数据绑定到WPF数据网格
- 29. WPF数据绑定和图像
- 30. WPF数据绑定和模板
这似乎是解决问题的更好方法。我并不真的认为转换器是一个好主意。样式看起来更合适,我不需要生成一个帮助属性来生成字符串值。我宁愿将我的ViewModel数据保存为它想要的数据。 – jlafay 2010-11-19 14:07:26
工作很好,并感谢图像示例,因为我想在我的视图中为另一个属性做类似的事情。 – jlafay 2010-11-19 14:24:57