Sto provando a collegare il mio ViewModel al mio ComboBox. Ho classe ViewModel definita in questo modo:Collegamento ComboBox WPF al mio ViewModel
class ViewModel
{
public ViewModel()
{
this.Car= "VW";
}
public string Car{ get; set; }
}
ho impostato questo ViewModel come DataContext in Window_Load come:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new CarModel();
}
Poi nel mio XAML, lo faccio per legare il mio ComboBox a questo ViewModel. Voglio mostrare la "VW", come selezionata per impostazione predefinita nella mia casella combinata:
<ComboBox Name="cbCar" SelectedItem="{Binding Car, UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Tag="Mazda">Mazda</ComboBoxItem>
<ComboBoxItem Tag="VW">VW</ComboBoxItem>
<ComboBoxItem Tag="Audi">Audi</ComboBoxItem>
</ComboBox>
Ho 2 domande:
- Come faccio a impostare il valore predefinito selezionato in Casella combinata a "VW" (una volta forma carichi, dovrebbe mostrare "VW" nella casella combinata).
- Invece di impostare ComboBoxItem come sopra in xaml, come impostarlo nel mio ViewModel e quindi caricarlo in ComboBox?
Grazie,
UPDATE: Finora, riesco a implementare questo, ma ottengo l'errore, come di seguito nel 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 dal le nuove proprietà di aggiornamento, creazione e anno dovrebbero vivere in classe Car, non in ViewModel. DefaultCar dovrebbe essere assegnato a un'istanza di car, non a una stringa, e rimuoverlo dal costruttore ViewModel. –
@ E-Bat Stai dicendo che ViewModel CLASS dovrebbe contenere solo IEnumerable Automobili e tutto il resto dovrebbe essere spostato in Car Class? O dovrei semplicemente rimuoverlo da ViewModel C-TOR? E come assegnare DefaultCar all'istanza di un'auto in questo caso? Non è già assegnato usando l'espressione sopra? Sarebbe possibile mostrare il cambiamento per favore? –
pixel
dbnex14, In questo caso ViewModel deve contenere solo le proprietà Cars e DefaultCar. DefaultCar può essere assegnato nel momento stesso in cui ottieni le auto dal tuo archivio dati. Quando la tua vista viene caricata e tenta di risolvere i suoi binding, la proprietà Cars verrà interrogata dalla tua vista (attivata dalla proprietà ItemsSource da ComboBox). Quindi in questo momento puoi assegnare DefaultCar prima di restituire l'elenco. Guarda la mia risposta qui sotto. –