2

質問:ComboBoxの選択されたアイテムのバインディングを1つのプロパティに設定し、アイテムリストを別のプロパティに設定するにはどうすればよいですか?


情報:

私は会社のために取り組んでいる在庫プログラムを持っています。これは主に、入荷時に出荷を受け取る人を対象としています。画面の片側に出荷のリストが表示されるように設定しています。これらのいずれかを選択すると、出荷に関するすべての情報が表示されるため、編集することができます。情報の1つは、貨物を受け取った人です。彼らが貨物をクリックしたときに、明らかに貨物を受け取ったユーザーがコンボボックスにポップアップするユーザーになるようにしたいと思います。しかし、コンボボックスに他のすべてのユーザーのリストを含める必要があります。

データベースからユーザーのリストを取得しているという事実がなければ、これは難しいことではありません。リストボックスには、ユーザーデータ型のリストから適切な情報を引き出すためのデータテンプレートがあります。これまでに試したのは、コンボボックスがリストにバインドするビューモデルにコレクションビューを設定し、次に、出荷データ型に付属する単一のユーザーインスタンスである個別のプロパティを設定することです。

MV-VMプログラミングモデルに従って、VisualBasicとXAMLでプログラミングしています。

4

2 に答える 2

1

あなたのアプローチに問題はありません。ViewModelは、データベースからのタイプのコレクションと、選択したアイテムにバインドされた別のプロパティを公開できます。たとえば、次のようになります。

public ObservableCollection<Shipment> AllShipments { get; private set; }
public Shipment SelectedShipment { get; set; }

// Constructor
public MyViewModel()
{
    AllShipments = ReadFromDb();
}

コンボボックスが空であるという点で

  • アプリを起動するときにVSの出力ウィンドウを確認してください-バインディングが失敗することについて不平を言う行はありますか?
  • xamlバインディングに対してプロパティのスペルを再確認してください
  • AllShipmentsゲッターにブレークポイントを設定して、ビューがバインディングをインスタンス化するときにnullにならないようにします。(上記のように)VMのコンストラクターでデータベースを読み取ると、これで問題ありません。

また、コンボボックスに出荷オブジェクトからのユーザーを表示する場合は、VM(またはそのベース)が実装されていることを確認INotifyPropertyChangedし、セッターでPropertyChangedイベントを発生させることを忘れないでください。SelectedShipmentこれにより、変更がビューに伝達されます。 DataBinding..。

お役に立てれば :)

于 2010-01-03T02:23:01.083 に答える
0

Linq-to-SQLを使用していると仮定して、この質問に答えます。

これは一般的なPITAの問題であり、オブジェクトのUserプロパティに、同じレコードを表している場合でも、データを入力したクエリのオブジェクトとは異なるオブジェクトShipmentへの参照が含まれています。UserUserComboBox

これを克服するには、のリストと同じから取得されたユーザーのリストにユーザーをバインドすることをお勧めしComboBoxます。DataContextShipments

例:

class ViewModel
{
    public List<User> Users { get; set; }
    public List<Shipment> Shipments { get; set; }
    public Shipment SelectedShipment { get; set; }

    public void ReadShipments()
    {
        using (var dc = new MyDataContext())
        {
            DataLoadOptions dlo = new DataLoadOptions();
            dlo.LoadWith<Shipment>(x => x.User);
            dc.LoadOptions = dlo;
            Shipments = dc.Shipments.ToList();
            Users = dc.Users.ToList();
        }
    }
}
于 2010-01-03T14:30:24.237 に答える