您好
我试图根据一些环境变量更改几个控件的属性,我想避免为datacontext中的每个控件创建一个属性,所以我想使用转换器根据控件名称设置属性。目标是为所有控件使用一个属性:
<Grid.Resources>
<local:NameToStringConverter x:Key="conv" />
</Grid.Resources>
<TextBlock Name="FordPerfect"
Text="{Binding ElementName="FordPerfect" Path=Name, Converter={StaticResource conv}, Mode=OneWay}"/>
<TextBlock Name="Arthur"
Text="{Binding ElementName="Arthur" Path=Name, Converter={StaticResource conv}, Mode=OneWay}"/>
<TextBlock Name="ZaphodBeeblebrox"
Text="{Binding ElementName="ZaphodBeeblebrox" Path=Name, Converter={StaticResource conv}, Mode=OneWay}"/>
和......
public class NameToStringConverter : IValueConverter
{
public object Convert(
object value, Type targetType,
object parameter, CultureInfo culture)
{
if (MyGlobalEnv.IsFlavor1 && ((string)value).Equals("ZaphodBeeblebrox")) return "42"
if (MyGlobalEnv.IsFlavor2 && ((string)value).Equals("ZaphodBeeblebrox")) return "43"
if (MyGlobalEnv.IsFlavor1 && ((string)value).Equals("Arthur")) return "44"
return "?";
}
public object ConvertBack(
object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotSupportedException("Cannot convert back");
}
}
我确信有更好更优雅的方式......有什么想法吗?
答案 0 :(得分:1)
单向数据绑定的目的只是将UI(XAML)与代码(CS)分离。在这里,您的代码和UI紧密联系在一起,试图通过数据绑定来实现这一点并不能为您带来任何好处。您可以通过编写一个获取数据值并将其正确应用于每个控件的方法来简化操作 - 仍然紧密耦合(坏),但至少代码是精简且易于遵循(不太糟糕)。
您应该做的不是依赖控件名称而是定义ConverterParameter。请参阅本文的底部1/3 http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters
答案 1 :(得分:0)
您可以在您的情况下直接绑定到环境变量:
<Window xmlns:system="clr-namespace:System;assembly=mscorlib" ...>
<TextBlock Text="{Binding Source={x:Static system:Environment.OSVersion}}"/>