我正在尝试将我的ComboBox绑定到字符串列表,我希望它在加载Window后显示默认值。
为此,我创建了一个ViewModel类,如:
namespace MyData
{
class ViewModel
{
public ViewModel()
{
this.Name = "";
this.Age = 0;
this.Address = "";
this.DateOfPurchase = DateTime.Now.AddDays(-30);
this.CarModel = "VW"; //I want to set VW as default but options are Mazda, VW, Audi
}
public IEnumerable<String> CarModels
{
get
{
var carModels = new String[] {"Mazda", "VW", "Audi"};
//CarModel = cars.FirstOrDefault(car => CarModel == "VW"); //this is not needed
return carModels;
}
}
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
public DateTime DateOfPurchase { get; set; }
public String CarModel { get; set; }
}
}
然后我将Window的DataSource设置为我的ViewModel
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.DataContext = new ViewModel();
}
最后,我想将我的控件绑定到这些数据。除了我的ComboBox之外,其他所有人都这样做了。我希望它能够将模型(Mazda,VW和Audi)作为其ComboBoxItems获得字符串数组,并且默认为第二个,即表格加载时为VW。
然后我在我的XAML中绑定它:
<ComboBox Name="cbCarModels" SelectedItem="{Binding CarModel, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding CarModels}">
这很有效!
答案 0 :(得分:2)
脱离我的头顶
在xaml
<Combobox ItemsSource="{Binding Path=CarModels}", SelectedItem="{Binding SelectedCar}/>
您需要创建ViewModel.SelectedCar模型。在vm.ctor中设置它
this.SelectedCar = Cars[1]
您可能必须将Path=CarModels, Mode=TwoWay
添加到绑定。
答案 1 :(得分:1)
如果要利用WPF(或任何基于XAML的语言)的MVVM,请了解DataBinding Engine与INotifyPropertyChanged
接口一起使用。用户界面订阅PropertyChanged
个事件,并根据绑定更新UI控件。
这是一个例子,只有相关的部分。请注意,我没有包含INPC的实现,但是有许多框架提供了抽象基类,如果您不想走这条路线,那么有很多资源可以描述如何实现INPC界面。
MyViewModel.cs:
public class MyViewModel : INotifyPropertyChanged
{
public MyViewModel()
{
CarModels = new[] {"Mazda", "VW", "Audi"};
SelectedCarModel = "VW";
}
public IEnumerable<string> CarModels { get; private set; }
private string _selectedCarModel;
public string SelectCarModel
{
get { return _selectedCarModel; }
set
{
if (_selectedCarModel == value) return;
_selectedCarModel = value;
OnPropertyChanged("SelectedCarModel");
}
}
}
XAML:
<ComboBox ItemsSource="{Binding Path=CarModels, Mode=OneTime}"
SelectedItem="{Binding Path=SelectedCarModel}" />
简单地说,如果您实现INPC并引发属性更改通知,DataBinding引擎将根据属性的名称调用属性get方法。然后它将更新必要的UI控件。此外,用户界面也将更新视图模型。
答案 2 :(得分:1)
此外,有时能够更方便地绑定到复杂对象(例如,在编辑现有对象的属性时)。为此,您可以按照建议覆盖此对象的DisplayMemberPath
方法,但您也可以通过{{1}将组合框项目中显示的值绑定到XAML中该对象的特定成员property:
<ComboBox ItemsSource="{Binding CarModel}" DisplayMemberPath="Name" SelectedItem="{Binding CarModels}" />
优点是您可以将这些额外的ToString()
代码保留在POCO之外。