編集:複数のテキストボックスに対してデータをバインドする
コメントを読んだ後、テキストボックスの例を詳しく説明します。
最初に重要なことは、ViewModelがビュー内のものをモデル化することです。これにより、ビューは必要な構造で必要なすべての情報を取得します。つまり、ビューに複数のテキストボスがある場合、ビューモデルにテキストボックスごとに1つずつ、複数の文字列プロパティが必要になります。
XAMLには、次のようなものがあります。
<TextBox Text="{Binding ID, Mode=TwoWay}" />
<TextBox Text="{Binding SomeOtherData, Mode=TwoWay}" />
そしてあなたのViewModelで
public class TestUserControlViewModel : BaseViewModel {
private string id;
private string someOtherData;
public TestUserControlViewModel() {
DataItem firstItem = new DataRepository().GetData().First();
this.ID = firstItem.ID;
this.SomeOtherData = firstItem.SomeOtherData;
}
public string ID {
get {
return this.id;
}
set {
if (this.id == value) return;
this.id = value;
this.OnPropertyChangedEvent("ID");
}
}
public string SomeOtherData {
get {
return this.someOtherData;
}
set {
if (this.someOtherData == value) return;
this.someOtherData = value;
this.OnPropertyChangedEvent("SomeOtherData");
}
}
}
ここでは、対応するイベントを発生させるメソッドBaseViewModel
があると想定しています。OnPropertyChangedEvent
これは、プロパティが変更されており、それ自体を更新する必要があることをビューに通知します。
Mode=TwoWay
XAMLのに注意してください。つまり、どちらの側で値が変更されても、もう一方の側では変更がすぐに反映されます。したがって、ユーザーがTwoWay
境界内の値を変更するTextBox
と、対応するViewModelプロパティが自動的に変更されます。また、その逆も同様です。プログラムでViewModelプロパティを変更すると、ビューが更新されます。
複数のデータ項目に対して複数のテキストボックスを表示する場合は、ViewModelにさらに多くのプロパティを導入し、それに応じてそれらをバインドする必要があります。たぶん、@ Haspemulatorがすでに答えているように、内部にListBox
柔軟な数のesを含むaが解決策です。TextBox
コレクションコントロールに対するデータのバインド
TestUserControl
私はあなたがListView
ロードされたもののリストを表示するためのコントロール(のような)を持っていると思います。したがって、そのコントロールをViewModelのリストに対してバインドします。
<ListView ... ItemsSource="{Binding GetAllData}" ... />
まず、バインディングとは「データを読み取ってからViewModelを忘れる」ことを意味しないことを理解する必要があります。代わりに、ビューが続く限り、ビューをViewModel(およびそのプロパティ)にバインドします。この観点から、はよりAllData
もはるかに良い名前ですGetAllData
(@Malcolm O'Hareに感謝します)。
これで、コード内で、ビューがプロパティを読み取るたびAllData
に、新しいDataRepository
ものが作成されます。バインディングのため、これは必要なことではありません。代わりにDataRepository
、ビューの存続期間全体にわたって1つのインスタンスを作成します。これは、初期データの読み取りに使用され、基になるデータベースの場合は後でビューの更新に使用できます。変更(おそらくイベントを伴う)。
このような動作を有効にするには、AllData
プロパティのタイプをに変更しObservableCollection
て、変更が発生した場合にビューがリストを自動的に更新できるようにする必要があります。
public class TestUserControlViewModel : BaseViewModel
private ObservableCollection<DataItem> allData;
public TestUserControlViewModel() {
IGetTheData src = new DataRepository();
this.allData = new ObservableCollection<DataItem>(src.GetData());
}
public ObservableCollection<DataItem> AllData {
get {
return this.allData;
}
}
public void AddDataItem(DataItem item) {
this.allData.Add(item);
}
}
これで、後で呼び出すAddDataItem
と、ListViewが自動的に更新されます。