ViewModelをComboBoxにバインドしようとしています。私はこのように定義されたのViewModelクラスを持っている:WPF ComboBoxをViewModelにバインドする
class ViewModel
{
public ViewModel()
{
this.Car= "VW";
}
public string Car{ get; set; }
}
私は同じようWindow_LoadにDataContextのように、このビューモデルを設定します。私のXAMLで次に
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new CarModel();
}
、私はこれのViewModelに私のコンボボックスをバインドするためにこれを行います。私のコンボボックスでは、デフォルトで選択されたとして、私は「VW」を表示したい:私はデフォルト値コンボボックスに「VW」(一度に選択されたセットにはどうすればよい
- :
<ComboBox Name="cbCar" SelectedItem="{Binding Car, UpdateSourceTrigger=PropertyChanged}"> <ComboBoxItem Tag="Mazda">Mazda</ComboBoxItem> <ComboBoxItem Tag="VW">VW</ComboBoxItem> <ComboBoxItem Tag="Audi">Audi</ComboBoxItem> </ComboBox>
私は2つの質問を持っていますフォームの読み込み、コンボボックスに "VW"と表示されます)。
- 上記のようなComboBoxItemsをxamlに設定するのではなく、ViewModelで設定してからComboBoxにロードする方法は?
おかげで、
UPDATE: はこれまでのところ、私はこれを実装するために管理が、私はViewModelにはC-TORで以下のようにエラーが出ます:
namespace MyData
{
class ViewModel
{
public ViewModel()
{
this.Make = "";
this.Year = 1;
this.DefaultCar = "VW"; //this is where I get error 'No string allowed'
}
public IEnumerable<Car> Cars
{
get
{
var cars = new Car[] { new Car{Model="Mazda"}, new Car{Model="VW"}, new Car{Model="Audi"} };
DefaultCar = cars.FirstOrDefault(car => car.Model == "VW");
}
}
public string Make { get; set; }
public int Year { get; set; }
public Car DefaultCar { get; set; }
}
class Car
{
public string Model { get; set; }
}
}
新しい更新、MakeおよびYearプロパティはViewModelではなく、Carクラスに存在する必要があります。 DefaultCarは、文字列ではなくcarのインスタンスに割り当て、ViewModelコンストラクタから削除する必要があります。 –
@ E-Bat ViewModelクラスはIEnumerableの車だけを保持し、それ以外のものはすべてCarクラスに移動する必要がありますか?それともViewModel C-TORから削除するだけですか?この場合、DefaultCarを車のインスタンスに割り当てる方法は?上記の式を使って既に割り当てられていませんか?変更を表示することは可能でしょうか? –
pixel
dbnex14この場合、ViewModelにはCarsプロパティとDefaultCarプロパティのみを含める必要があります。 DefaultCarは、データストアからCarsを取得した瞬間に割り当てることができます。ビューが読み込まれ、バインディングを解決しようとすると、Carsプロパティがビューから照会されます(ComboBoxのItemsSourceプロパティによってトリガーされます)。次に、リストを返す前にDefaultCarを割り当てることができます。私の答えは以下を参照してください。 –