繁体   English   中英

WPF如何绑定组合框

[英]WPF How To Bind ComboBox

我正在尝试将我的ComboBox绑定到字符串列表,并且希望在加载窗口后显示默认值。

为此,我创建了一个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之外,我对其他所有对象都这样做。 我希望它获得带有模型(马自达,大众和奥迪)的字符串数组作为其ComboBoxItems并默认为2nd,即一旦加载窗体即为大众。

然后在XAML中将其绑定如下:

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

这有效!

从我的头顶

在xaml中

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

您需要创建ViewModel.SelectedCar模型。 在vm.ctor中设置

this.SelectedCar = Cars[1]

您可能必须将Path=CarModels, Mode=TwoWay到绑定。

如果要通过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控件。 此外,用户界面也会更新视图模型。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM