C# WPF如何绑定组合框

C# WPF如何绑定组合框,c#,wpf,xaml,C#,Wpf,Xaml,我试图将我的组合框绑定到字符串列表,我希望它在加载窗口后显示默认值 为此,我创建了一个ViewModel类,如: namespace MyData { class ViewModel { public ViewModel() { this.Name = ""; this.Age = 0; this.Address = ""; this.DateOfPur

我试图将我的组合框绑定到字符串列表,我希望它在加载窗口后显示默认值

为此,我创建了一个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; }
    }
}
最后,我想将我的控件绑定到此数据。除了我的组合框,我已经为所有其他人这样做了。我想让它得到字符串数组模型马自达,大众和奥迪作为其ComboBoxItems,并默认为第二,这是大众一旦表单加载

然后我在我的XAML中像这样绑定它:

<ComboBox Name="cbCarModels" SelectedItem="{Binding CarModel, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding CarModels}">
这很有效

从我的头顶上

在xaml中

<Combobox ItemsSource="{Binding Path=CarModels}", SelectedItem="{Binding SelectedCar}/>

您可能需要将Path=CarModels,Mode=TwoWay添加到绑定中。

如果您要利用带有WPF或任何基于XAML的语言的MVVM,那么请了解数据绑定引擎在INotifyPropertyChanged接口中工作得很好。用户界面订阅PropertyChanged事件,并根据绑定更新UI控件

这里是一个示例,仅包含相关部分。请注意,我没有包括INPC的实现,但是有许多框架提供了抽象基类,如果您不想这样做,那么有很多资源描述了如何实现INPC接口

MyViewModel.cs:

XAML:


简单地说,如果实现INPC并发出属性更改通知,那么数据绑定引擎将根据属性名称调用属性get方法。然后,它将更新必要的UI控件。此外,用户界面还将更新viewmodel。

此外,有时可以更方便地绑定到复杂对象,例如在编辑现有对象的属性时。为此,您可以按照建议覆盖此对象的ToString方法,但也可以通过DisplayMemberPath属性将combobox项中显示的值绑定到XAML中该对象的安全成员:

<ComboBox ItemsSource="{Binding CarModel}" DisplayMemberPath="Name" SelectedItem="{Binding CarModels}" />

这样做的好处是,您可以将额外的ToString代码保留在POCO之外。

我已经找到了答案,但谢谢Jeff。我更新了我的问题。这就是现在的答案。仅供参考,如果是字符串,则设置Car=的方式会起作用,但一旦项目不是字符串,则不会起作用。所选项目必须是来自项目源的实例。注释掉//这不是必需的实际上是更好的全面方法。项目将是字符串。它不应该被称为汽车,而应该被称为CarModel。我将update@jeff但请你解释一下好吗。为什么我不能使用字符串。我知道,如果我想让下拉列表保存像汽车这样的对象,在这种情况下,我可能必须重写toString或我的汽车类来显示我想要的内容。你可以使用字符串。这不是问题。当您进入应用程序时,您会发现绑定到对象而不是字符串更常见。按照您的示例,假设Car不是一个字符串,而是一个具有更多属性的对象。然后你将绑定到Car.Namefwiw…如果你覆盖了ToString,你做错了,你只是还没有得到wpf范例。
this.SelectedCar = Cars[1]
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");
        }
    }
}
<ComboBox ItemsSource="{Binding Path=CarModels, Mode=OneTime}"
          SelectedItem="{Binding Path=SelectedCarModel}" />
<ComboBox ItemsSource="{Binding CarModel}" DisplayMemberPath="Name" SelectedItem="{Binding CarModels}" />