2011-03-21 72 views
1

你好
我試圖按照一些環境變量來改變一些控件的屬性,我想,以避免造成對DataContext的每個控件的屬性,所以我想用轉換器它根據控件名稱設置屬性。目標是用一個屬性對所有控件:WPF:多個控件綁定到同一屬性

<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

我不明白這一點。你想將TextBox.Text設置爲「?」除非TextBox.Name ==「6 * 9」,那麼它會是「42」?有很多方法可以做到這一點,而且大多數方法都不那麼混亂(會說'顯而易見'...)。請告訴我們你的真正目標! – 2011-03-21 11:48:29

+0

@Markus是否更好? – 2011-03-21 11:57:28

回答

1

單向數據綁定的意義在於將UI(XAML)與代碼(CS)分離。在這裏,你的代碼和用戶界面緊密結合在一起,試圖通過數據綁定來做到這一點實在不會爲你購買任何東西。您可以通過編寫一種方法來簡化事情,該方法將數據值並將其正確應用於每個控件 - 仍然緊密耦合(不良),但至少代碼是簡潔並易於遵循(不太糟糕)。

你應該儘可能做的不是依賴控件名稱,而是定義一個ConverterParameter。看到這篇文章http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters

+0

我知道有更優雅的東西...... :) 10倍。 (順便說一句,OneWay不是問題......) – 2011-03-21 14:55:20

0

您可以直接在您的具體情況結合到環境變量的底部1/3:

<Window xmlns:system="clr-namespace:System;assembly=mscorlib" ...> 
<TextBlock Text="{Binding Source={x:Static system:Environment.OSVersion}}"/> 
相關問題