2016-10-28 3 views
1

textBox привязка logContent в другом классе. Если я изменяю значение переменной logContent в MainWindow, все работают правильно. Но если я изменяю значение переменной logContent в Test.cs (когда я нажимаю кнопку), он не работает.привязка не работает в другом классе

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 
    } 
} 

XAML из TextBox

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

ответ

0

в вашем коде, DataBinding не работает ни в одном классе.

Вы можете увидеть это с помощью этого простого теста (вы должны добавить Loaded-событие в 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. Поэтому, если вы измените свой 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

Спасибо, он работает. У меня мало проблем с пониманием этого кода. Но он работает. Большое спасибо :) –

Смежные вопросы