2011-03-21 102 views
1

こんにちは
いくつかの環境変数に応じていくつかのコントロールのプロパティを変更しようとしていますが、私はdatacontextの各コントロールのプロパティを作成しないようにしたいので、コントロール名に従ってプロパティを設定します。目標は、すべてのコントロールのプロパティを1つ使用することです: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"になるでしょうか?それを行うには多くの方法があり、ほとんどがあまりにも邪魔されています。(「明白な」と言いました...)。本当の目標を教えてください! –

+0

@Markus 2つより良いですか? –

答えて

1

一方向データバインディングのポイントは、UI(XAML)とコード(CS)を切り離すことです。ここでは、コードとUIが密接に結びついているため、データバインドでこれを実行しようとすると、実際には何も購入されません。データ値を受け取り、各コントロールに正しく適用するメソッドを作成することで、単純化することができます。まだ密接に結合されていますが、少なくともコードは凝縮されており、簡単に(悪くなくても)簡単です。

あなたはおそらく何をすべきでしょうか?コントロール名に頼るのではなく、ConverterParameterを定義します。この記事あなたはあなたの状況で、環境変数に直接結合することができるhttp://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters

+0

私はもっとエレガントなものがあることを知っていた... :) 10倍。 (ところで、OneWayは問題ではなかった...) –

0

の下部1/3を参照してください。

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