Tôi đang cố gắng ràng buộc ViewModel của tôi vào ComboBox của tôi. Tôi có lớp ViewModel được định nghĩa như thế này:WPF Binding ComboBox vào ViewModel
class ViewModel
{
public ViewModel()
{
this.Car= "VW";
}
public string Car{ get; set; }
}
tôi đặt ViewModel này như DataContext trong Window_Load như:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new CarModel();
}
Sau đó, trong XAML của tôi, tôi làm điều này để ràng buộc ComboBox của tôi để ViewModel này. Tôi muốn hiển thị "VW" như chọn theo mặc định trong ComboBox của tôi:
<ComboBox Name="cbCar" SelectedItem="{Binding Car, UpdateSourceTrigger=PropertyChanged}">
<ComboBoxItem Tag="Mazda">Mazda</ComboBoxItem>
<ComboBoxItem Tag="VW">VW</ComboBoxItem>
<ComboBoxItem Tag="Audi">Audi</ComboBoxItem>
</ComboBox>
Tôi có 2 câu hỏi:
- Làm thế nào để thiết lập giá trị mặc định được chọn trong Combo Box để "VW" (một lần tải biểu mẫu, nó sẽ hiển thị "VW" trong hộp tổ hợp).
- Thay vì thiết lập ComboBoxItems như trên trong xaml, làm thế nào để tôi đặt nó trong ViewModel của tôi và sau đó tải chúng trong ComboBox?
Cảm ơn,
UPDATE: Cho đến nay, tôi quản lý để thực hiện điều này nhưng tôi nhận được lỗi như sau trong 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 từ của bạn các thuộc tính cập nhật, Tạo và Năm mới phải nằm trong lớp Ô tô chứ không phải trong ViewModel. DefaultCar nên được gán cho một thể hiện của ô tô, không phải một chuỗi và loại bỏ nó khỏi hàm tạo ViewModel của bạn. –
@ E-Bat Bạn có nói rằng ViewModel CLASS chỉ nên giữ IEnumerable Ô tô và mọi thứ khác nên được chuyển sang Car CLASS? Hoặc tôi chỉ cần loại bỏ nó từ ViewModel C-TOR? Và làm thế nào để gán DefaultCar cho ví dụ của một chiếc xe trong trường hợp này? Không phải nó đã được gán bằng cách sử dụng biểu thức trên? Có thể cho thấy sự thay đổi không? –
pixel
dbnex14, Trong trường hợp này, ViewModel chỉ nên chứa Ô tô và các thuộc tính DefaultCar. DefaultCar có thể được chỉ định trong thời điểm bạn nhận được Ô tô từ kho dữ liệu của bạn. Khi View của bạn tải và nó cố gắng để giải quyết các ràng buộc của nó, họ tài sản Ô tô sẽ được truy vấn từ View của bạn (kích hoạt bởi ItemsSource bất động sản từ ComboBox). Sau đó, trong thời điểm này, bạn có thể gán DefaultCar trước khi trả về danh sách. Xem câu trả lời của tôi dưới đây. –