2016-10-28 2 views
1

他のクラスのtextBox binding logContent。 MainWindowの変数logContentの値をすべて変更すると正常に動作します。しかし、Test.csの変数logContentの値を変更すると(ボタンをクリックしたとき)、それは機能しません。バインディングは別のクラスでは機能しません

MainWindow.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     textBox.DataContext = Log.Instance; 
     Log.Instance.logContent += "aaa" + Environment.NewLine; //this working 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     Test.Instance.Volaj(); 
    } 
} 

Log.cs

class Log 
{ 
    public string logContent { get; set; } 

    private static Log instance; 
    public static Log Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new Log(); 
      } 
      return instance; 
     } 
    } 
} 

Test.cs

class Test 
{ 
    private static Test instance; 
    public static Test Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new Test(); 
      } 
      return instance; 
     } 
    } 

    public void Volaj() 
    { 
     Log.Instance.logContent += "bbb" + Environment.NewLine; //not working 
    } 
} 

、テキストボックス(TextBox)コントロールのXAML

<TextBox 
x:Name="textBox" 
HorizontalAlignment="Left" 
Height="154" 
Margin="10,155,0,0" 
TextWrapping="Wrap" 
Text="{Binding logContent}" 
VerticalAlignment="Top" 
Width="497"/> 

答えて

0

あなたのコードでは、DataBindingはどのクラスでも動作していません。

あなたはこの簡単なテスト(あなたがMainWindow.xamlにロードされ、イベントを追加する必要があります)でこれを見ることができます:

public MainWindow() 
{ 
    InitializeComponent(); 
    textBox.DataContext = Log.Instance; 
    Debug.WriteLine($"Text [ctor before change]: {textBox.Text}"); 
    // Output: 
    Log.Instance.logContent += "aaa" + Environment.NewLine; //this working 
    Debug.WriteLine($"Text [ctor after change]: {textBox.Text}"); 
    // Output: 
} 

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    Test.Instance.Volaj(); 
} 

private void MainWindow_OnLoaded(object sender, RoutedEventArgs e) 
{ 
    Debug.WriteLine($"Text [Loaded before change]: {textBox.Text}"); 
    // Output: aaa 
    Log.Instance.logContent += "bbb" + Environment.NewLine; 
    Debug.WriteLine($"Text [Loaded after change]: {textBox.Text}"); 
    // Output: aaa 
} 

TextBox.Textプロパティは、コンストラクタ中に変化しません。コンストラクタが終了すると、ビューはDataContextを一度読み取ってTextプロパティを更新します。そのため、TextBoxのテキストが表示されます。 Loaded-Eventが発生すると、TextBoxにはすでにテキスト値が設定されています。その他の変更は表示されません。

バインディングを有効にするには、プロパティが変更されたことをビューに通知する必要があります。このため、INotifyPropertyChanged-Interfaceが存在します。したがって、Log.csを次のように変更すると、動作するはずです。

class Log : INotifyPropertyChanged 
{ 
    private string _logContent; 

    public string logContent 
    { 
     get { return _logContent; } 
     set { _logContent = value; OnPropertyChanged(); } 
    } 

    private static Log instance; 
    public static Log Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new Log(); 
      } 
      return instance; 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

ありがとうございます。私はそのコードを理解することにほとんど問題がありません。しかし、それは働いています。どうもありがとうございました :) –

関連する問題