2015-11-09 4 views
0

Я создал свой собственный класс сокетов и экземпляр его в MainWindow.xaml.cs, и я хочу создать небольшой маленький TextBlock для контроля состояния соединения. Я использовал эту конкретную ссылку: WPF textblock binding in XAMLBind TextBlock Значение для объекта

Вот попытка кода. ComUplink.cs:

public class ComUplink 
    { 
     public String ConnectionStatus = "Idle"; 
     public Socket Socklink; 
    } 

В MainWindow.xaml.cs:

public partial class MainWindow : Window 
    { 
     ComUpLink Uplink; 
     ... 
     public void Login_Click(object Sender, RoutedEventArgs e) 
     { 
      Uplink = new ComUpLink(); 
     } 
    } 

И в файле XAML:

<TextBlock x:Name="textBlock3" 
    TextAlignment="Right" 
    HorizontalAlignment="Left" 
    Margin="12,218,0,0" 
    TextWrapping="Wrap" 
    Text="{Binding Path=Uplink.ConnectionString}" 
    VerticalAlignment="Top" 
    Foreground="#616161" 
    Width="236"/> 

Итак, мой вопрос, почему это не связывающие должным образом? Мне не хватает реализации INotifyPropertyChanged?

ответ

1

Ну вы сделали три маленькие ошибки:

  1. Вы можете привязать только к свойствам (если эти значения изменяются с помощью INotifyPropertyChanged)
  2. Вам нужно установить DataContext
  3. Вашего Binding используется неправильное имя свойства (ConnectionString вместо ConnectionStatus)

Попробуйте эту Modific ations:

в MainWindow.xaml.cs:

public void Login_Click(object Sender, RoutedEventArgs e) 
{ 
    this.DataContext = new ComUpLink(); 
} 

в ComUplink.cs:

public class ComUplink : INotifyPropertyChanged 
{ 
    private String connectionStatus = "Idle"; 
    public String ConnectionStatus 
    { 
     get 
     { 
      return this.connectionStatus; 
     } 
     set 
     { 
      this.connectionStatus = value; 
      this.OnPropertyChanged(); 
     } 
    } 

    private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    public Socket Socklink; 
} 

в MainWindow.xaml:

<TextBlock x:Name="textBlock3" 
TextAlignment="Right" 
HorizontalAlignment="Left" 
Margin="12,218,0,0" 
TextWrapping="Wrap" 
Text="{Binding Path=ConnectionStatus}" 
VerticalAlignment="Top" 
Foreground="#616161" 
Width="236"/> 
+0

Это много работы и изменение структуры для одной функции. Спасибо хоть. – Fuselight

+0

Это сработало для вас? Вы должны привыкнуть к этому, в то время как WPF основан на этих концепциях. – christoph

+0

Да! И что вы подразумеваете под ** в то время как **? Может ли он скоро измениться? – Fuselight

1

Прежде всего, необходимо установить контекст данных текстового блока как основное окно или свойство. Во-вторых вам нужно привязать к общественной собственности не на поле

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