Próbuję powiązać mój ViewModel z moim ComboBox. Mam klasę ViewModel zdefiniowany następująco:WPF Binding ComboBox do mojego ViewModel
class ViewModel
{
public ViewModel()
{
this.Car= "VW";
}
public string Car{ get; set; }
}
ustawić ten ViewModel jako DataContext w Window_Load jak:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new CarModel();
}
potem w moim XAML, zrobić to wiązać moje ComboBox do tego ViewModel. Chcę pokazać „VW” jako domyślnie zaznaczone w moim ComboBox:
<ComboBox Name="cbCar" SelectedItem="{Binding Car, UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Tag="Mazda">Mazda</ComboBoxItem>
<ComboBoxItem Tag="VW">VW</ComboBoxItem>
<ComboBoxItem Tag="Audi">Audi</ComboBoxItem>
</ComboBox>
mam 2 pytania:
- W jaki sposób ustawić wartość domyślną wybrano Combo Box na „VW” (raz formuje obciążenia, powinien pokazywać "VW" w polu kombi).
- Zamiast ustawić ComboBoxItems jak wyżej w Xaml, jak ustawić go w moim ViewModel, a następnie załadować je w ComboBox?
Dzięki
UPDATE: Jak dotąd udaje mi się realizować to, ale pojawia się błąd jak poniżej w 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; }
}
}
Ok dostępne na Twoim koncie nowa aktualizacja, marka i rok powinny żyć w klasie samochodów, a nie w ViewModel. Wartość DefaultCar powinna zostać przypisana do instancji samochodu, a nie do napisu i usunąć go z konstruktora ViewModel. –
@ E-Bat Czy mówisz, że ViewModel CLASS powinien zawierać tylko IEnumerable Cars i wszystko inne powinno zostać przeniesione do CLASS CLASS? Czy powinienem po prostu usunąć go z ViewModel C-TOR? I jak przypisać DefaultCar do instancji samochodu w tym przypadku? Czy nie jest już przypisany przy użyciu powyższego wyrażenia? Czy możliwe jest pokazanie zmiany, proszę? –
pixel
dbnex14, W tym przypadku ViewModel powinien zawierać tylko właściwości Cars i DefaultCar. DefaultCar można przypisać w momencie, gdy otrzymasz samochody ze swojego magazynu danych. Po załadowaniu widoku i próbie rozwiązania powiązań, ich właściwości Cars będą sprawdzane z poziomu widoku (wywołane przez właściwość ItemsSource z ComboBox). W tym momencie możesz przypisać wartość DefaultCar przed zwróceniem listy. Zobacz moją odpowiedź poniżej. –