2016-10-01 7 views
0

私は現在、XAMLの使い方と、C#とのやり取りの仕組みを研究しています。私の現在の課題は、チェックボックスがチェックされたときに表示されるテキストを変更するテキストブロックを取得しようとしていることです。これには、プログラムがBool入力を受け取り(ボックスにチェックが入っていますか?)、文字列出力が必要です。バインディング時データ型間でどのように変換しますか?

現在、レイアウトを実行すると、XAMLコードは問題ないと思われますが、チェックボックスがオンになっているかどうかにかかわらず、テキストブロックには "unticked"状態が表示されます。

問題は2つの方法の間にあると思われますが、解決策や提案は見つけられませんか?

問題のコード:問題のC#

public class MainPageViewModel : ViewModelBase 
{ 
    //stores value of checkbox 
    private bool _BoxCheckBool; 

    //Updates value of _BoxCheckBool 
    public bool BoxCheckBool 
    { 
     set 
     { 
      Set(ref _BoxCheckBool, value); 
     }   
    } 

    //stores value (for textblock) 
    private string _BoxCheckString; 

    public string BoxCheckString 
    { 
     //logic that determines what will be sent to the textblock 
     get 
     { 
      if (_BoxCheckBool == true) 
      { 
       _BoxCheckString = "The Box has been checked"; 
      } 

      else if (_BoxCheckBool == false) 
      { 
       _BoxCheckString = "The Box has not been checked"; 
      } 

      else 
      { 
       _BoxCheckString = "ERROR"; 
      } 

      return _BoxCheckString; 
     } 

     set 
     { 
      Set(ref _BoxCheckString, value); 
     } 
    } 
} 

コード:XAML

<CheckBox x:Name="BoxTest" HorizontalAlignment="Center" Content="Check Box" IsChecked="{Binding BoxCheckBool, Mode=TwoWay}"/> 

    <TextBlock x:Name="BoxTestOutput" Grid.Row="1" Text="{Binding BoxCheckString, Mode=TwoWay}"/> 
+0

、それは非常に参考にされている、あなたのアドバイスをみんなに感謝します。 :) – TheSkeletonDetective

答えて

0

あなただけboolプロパティが変更されたときPropertyChangedイベントを発生させる必要があります。 UIが自動的に更新されます

public class MainPageViewModel : ViewModelBase 
{ 
    //stores value of checkbox 
    private bool _BoxCheckBool; 

    //Updates value of _BoxCheckBool 
    public bool BoxCheckBool 
    { 
     set 
     { 
      Set(ref _BoxCheckBool, value); 
      // Assumes your ViewModelBase have method to raising this 
      RaisePropertyChanged("BoxCheckString"); 
     }   
    } 

    private string _BoxCheckString; 

    public string BoxCheckString 
    { 
     //logic that determines what will be sent to the textblock 
     get 
     { 
      if (_BoxCheckBool == true) 
      { 
       _BoxCheckString = "The Box has been checked"; 
      } 
      else 
      { 
       _BoxCheckString = "The Box has not been checked"; 
      } 
      // Boolean type have only two value (true/false) 
      // - you don't need checking for "errors" 
      return _BoxCheckString; 
     } 
     set 
     { 
      Set(ref _BoxCheckString, value); 
     } 
    } 
} 
0

値が変更されたときに通知がなかったため、テキストブロックが更新されませんでした。

バインディングを更新するには、property change notification (Please check out this link)を実装する必要があります。あなたは、BoxCheckBoolのセッターの中のOnPropertyChanged("BoxCheckString")(あなたのViewModelBaseによる)のようなものを、更新が必要であると分かるように呼び出す必要があります。

+0

ああ、大丈夫です。興味のない場合は、2番目のメソッドに更新をチェックするよう指示する必要がありますか、それを参照するテキストブロックが自動的に更新を行うのですか? – TheSkeletonDetective

+0

'BoxCheckString'が望ましい値に更新された後、' BoxCheckString'に対して 'PropertyChanged'イベントが生成されていることを確認してください。そうすれば、テキストブロックは最新の' BoxCheckString'を得ることができます。テキストブロックは、 'BoxCheckString'の各PropertyChangedイベントごとに自動的に更新されます。 –

0

あなたはテキスト値を変更しているが、間違った場所である:

のViewModel:

private bool _BoxCheckBool; 

    //Updates value of _BoxCheckBool 
    public bool BoxCheckBool 
    { 
     get 
     { 
      return _BoxCheckBool; 
     } 
     set 
     { 
      _BoxCheckBool = value; 
      OnPropertyChanged("BoxCheckBool"); 
      if (_BoxCheckBool == true) 
      { 
       BoxCheckString = "The Box has been checked"; 
      } 

      else if (_BoxCheckBool == false) 
      { 
       BoxCheckString = "The Box has not been checked"; 
      } 

      else 
      { 
       BoxCheckString = "ERROR"; 
      } 
     } 
    } 

    //stores value (for textblock) 
    private string _BoxCheckString = ""; 

    public string BoxCheckString 
    { 
     //logic that determines what will be sent to the textblock 
     get 
     { 
      return _BoxCheckString; 
     } 
     set 
     { 
      _BoxCheckString = value; 
      OnPropertyChanged("BoxCheckString");  
     } 
    } 

XAML:

<StackPanel Orientation="Horizontal"> 
     <CheckBox Name="BoxTest" IsChecked="{Binding BoxCheckBool, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
     <ContentPresenter Content="{Binding BoxCheckString, UpdateSourceTrigger=PropertyChanged}" /> 
    </StackPanel> 
関連する問題