你好
我正在尝试根据某些环境变量更改多个控件的属性,并且我想避免为数据上下文中的每个控件创建属性,因此我考虑使用根据控件名称设置属性的转换器。目标是为所有控件使用一个属性:
<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");
}
}
我确信有更好、更优雅的方式...有什么想法吗?
单向数据绑定的目的只是将 UI (XAML) 与代码 (CS) 解耦。 在这里,您的代码和 UI 紧密地联系在一起,尝试通过数据绑定来做到这一点实际上并没有给您带来任何好处。 您可以通过编写一个获取数据值并将其正确应用于每个控件的方法来简化事情 - 仍然紧密耦合(不好),但至少代码是简洁的并且易于遵循(不太坏)。
您可能应该做的不是依赖于控件名称,而是定义一个 ConverterParameter。
您可以根据您的情况直接绑定到环境变量:
<Window xmlns:system="clr-namespace:System;assembly=mscorlib" ...>
<TextBlock Text="{Binding Source={x:Static system:Environment.OSVersion}}"/>