これを行う最善の方法はデータバインディングです。
私たちのデータがどこから来ているのかを最初に定義する必要があります。これはコンテキストと呼ばれます。これは、MVVM用語であるViewModelから来る予定です。あなたがMVVMを認識していない場合、心配する必要はありません、これはちょうどあなたが持っているどのクラスから来ることができます。バックエンドの.xaml.csコードでは、ウィンドウのDataContextにクラスを追加する必要があります。ここではそれは次のようになります。
public partial class DebugView : Window
{
public DebugView()
{
InitializeComponent();
DataContext = new DebugViewModel();
}
}
そして、我々はそのように定義されたラベルとテキストボックスを持っていますウィンドウの私たちのWPFのXAMLファイルで:
<Label Content="{Binding ClientCount, FallbackValue='Clients: 00'}" ... />
<TextBox Text="{Binding Port, UpdateSourceTrigger=PropertyChanged}" ... />
ラベルのテキストは、それが "だですテキストボックスのテキストは単なる「テキスト」です。そこにbindingキーワードを追加すると、それぞれのテキストは変数ClientCount
とPort
にリンクしています。だから、私たちのDebugViewModel
クラスが最初で、次のようになります。
private string _ClientCount;
public string ClientCount
{
get { return _ClientCount; }
set { _ClientCount= value; RaisePropertyChanged("ClientCount"); }
}
private string _Port;
public string Port
{
get { return _Port; }
set { _Port= value; RaisePropertyChanged("Port"); }
}
今、あなたは機能は、私がやったのでRaisePropertyChanged()
と呼ばれていない(と私は一般的な方法だと思う)私はINotifyPropertyChanged
を実装基本クラスを作りましたそこのすべての作業を処理します。
BaseViewModel
という基本クラスはINotifyPropertyChanged
クラスから継承し、私たちのためにすべてをセットアップします。それはちょうど、この(ちょうどペーストをコピーしているように使用して自由に感じる)のようになります。
using System.ComponentModel;
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
internal void RaisePropertyChanged(string prop)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
// Other functions we want all ViewModels to have
}
ので、その後、私たちのDebugViewModel
クラスには、次のようになります。あなたがプログラムを起動し、その後
public class ServerViewModel : BaseViewModel
{
private string _ClientCount;
public string ClientCount
{
get { return _ClientCount; }
set { _ClientCount= value; RaisePropertyChanged("ClientCount"); }
}
private string _Port;
public string Port
{
get { return _Port; }
set { _Port= value; RaisePropertyChanged("Port"); }
}
public DebugViewModel()
{
// Initialize to default values
ClientCount = $"Clients {server.clientCount}";
Port = $"{server.port}";
}
// Rest of code
}
とをフィールドを自動入力し、テキストボックス内のデータを変更すると文字列が変更され、その逆もあります。 XAML宣言のUpdateSourceTrigger=PropertyChanged
部分は、テキストボックスのデータが変更されるとすぐに変数が更新されるようにします(デフォルトの動作は、テキストボックスがフォーカスを失ったとき、たとえば次のテキストボックスに移動するときやクリックしたときです)。
これは、タイプされた入力を動的に検証することができるだけでなく、UIスレッドに切り替えてUIを更新することを心配する必要がなく、IMOによってコードが簡単に見えるようになります。
タイマーを使用して、特定のインターバル内のすべての値を更新します。 – CSharpie
Caliburn MicroまたはReactiveUIを使用する場合は、これらの問題を完全に解決するアプリ内メッセージディスパッチ用のいくつかのpub-sub実装があります。 –