2010-11-18 14 views
2

私のViewModelには、IsConnectedというboolプロパティがあり、MainWindowのTextBlockにバインドしたいと思います。テキストブロックをtrueまたはfalseと読み替えるのではなく、代わりにConnectedまたはDisconnectedと言う必要があります。私がWPFを初めて使ったので私を許してください。もし誰かが私に頭をスタートさせることができたら、そこから取り除くことができますが、私は必要なものを見つけ出す方法がわかりません。WPFデータのバインドと書式設定

答えて

2

私は、一般的に(私は本当に価値コンバータを嫌い)だけビューモデルにプロパティを追加することを好むだろうが、ここであなたのスタイルを使用して何をしようとして達成するための簡単な方法があります:

<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> 
+0

これは問題のより良い解決策であるようです。私は本当にコンバータがそんなに良いアイデアだとは思っていません。スタイルはよりよくフィットするように見え、文字列値を生成するヘルパープロパティを作成する必要はありません。私はむしろViewModelデータを意図したデータとして保持したいと思います。 – jlafay

+0

私は別のプロパティのために私のビューで同様のことをしたいので、偉大な働き、イメージの例に感謝します。 – jlafay

4

おそらく最も簡単な方法は、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}" /> 
+0

詳細を入力してください。 – ocodo

+1

これを行う唯一の変更は、文字列リソースファイルからテキストを取得することです。そうすれば、汎用のBoolToStringコンバーターにすることができます。コンバーターパラメーターを使用してリソースキーのプレフィックスを渡します(プレフィックス+ブール値==リソースから文字列を取得するために必要な完全キー)。 – slugster

+0

@slugster、私はそれに同意します。それについて少し考えてみましたが、このサンプルでは簡単に捨てました。 – ThomasAndersson

0

あなたがこの中に行うことができます2つの方法

1)それが目的の文字列の代わりに、

最も簡単な方法は、#2であるブール値を返すようにコンバータ

2)のViewModelに機能を変更を書くが、あなたは本当にbool値が必要な場合#1(google converterとwpf)に行くコードのどこか他の場所

0

バリューコンバータを見てください。あなたのXAMLで

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"); 
    } 
} 

のViewModelを使用して
<Window.Resources> 
    <l:BoolToConnectedConverter x:Key="boolToConnectedConverter" /> 
</Window.Resources> 
<Grid> 
    <Label Content="{Binding IsConnected, Converter={StaticResource boolToConnectedConverter}}" /> 
</Grid> 
1

、次の2台のプロパティラップを書き、不動産に変更を通知します。

値が変更されるたびに、文字列表現は更新され、コントロールにバインドされますが、コードではboolプロパティを引き続き使用できます。

public string IsConnectedStr{ 
    get{ 
    return IsConnected?"Connected":"Disconnected"; 
    } 
} 

public bool IsConnected{ 
    get{ 
    return _isConnected; 
    } 
    set{ 
    _isConnected=value; 
    PropertyChanged("IsConnected"); 
    PropertyChanged("IsConnectedStr"); 
    } 
}