【问题标题】:Converter with Combobox in WPFWPF中带有组合框的转换器
【发布时间】:2013-09-29 20:44:33
【问题描述】:

假设我有一堂课,address

public partial class Address
{
    public int Id { get; set; }
    public Nullable<int> CountryId { get; set; }
    public Nullable<int> CityId { get; set; }
    public string Details { get; set; }
    public Nullable<bool> IsDefault { get; set; }
    public Nullable<int> PersonId { get; set; }
}

Cities 组合框的每一行需要不同的值。例如,第一行需要“巴黎、马赛”,第二行需要“阿布扎比、迪拜、沙迦”,第三行需要“伦敦、诺丁汉”。

如何在网格内使用带有组合框的转换器,根据网格内另一个组合框中的选定国家/地区显示该组合框中的城市并显示 CityName 我在哪里有一个城市类数组,其中包含转换器中的名称属性?

我需要知道语法。如何使用 countryID 将其传递给转换器以获取城市列表并将其绑定到数据网格中的 CityCombobox 并在更改 Country 时根据所选国家/地区更新此列表?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    创建另一个代表 Country 和 City 集合的属性。

    public partial class Address
    {
        public int Id { get; set; }
        public ObservableCollection<Country> Countries{get;set;}
        public Nullable<int> CountryId { get; set; }
        public ObservableCollection<City> Cities{get;set;}
        public Nullable<int> CityId { get; set; }
        public string Details { get; set; }
        public Nullable<bool> IsDefault { get; set; }
        public Nullable<int> PersonId { get; set; }
    }
    

    现在您有两个集合,分别代表国家和城市。

    <DataTemplate>
    <ComboBox ItemsSource="{Binding Countries}" SelectedItem = "{Binding CountryId}" />
    </DataTemplate>
    

    将所有控件放在这里。 Country 代表整个集合,而 selectedItem 代表单个项目。

    您可以使用 INotifyProperty 为您的 CountryId 实现 propertychanged 通知,以便您可以相应地填充 Cities。

    编辑

    您需要有一个 Address 集合并将该集合传递给 Grid 的 ItemsSource。

    ObservableCollection<Address> = new ObservableCollection<Address>();
    //Load Addresses for each entity
    //and show it as ItemsSource of the Grid. 
    

    单行将代表单个地址对象。

    【讨论】:

    • 我已经这样做了,但我发现所有行都绑定到同一个城市 observablecollection 所以过滤选定的国家所有组合框都被过滤到选定的国家,这是错误的,我已经搜索过,我发现该转换器可能对我有帮助,但我不知道如何在我的情况下使用它
    • 我的意思是,如果两个组合框不在网格中但在网格内它不能正常工作,那么你的答案将起作用,因为我需要将每行中的每个城市组合框绑定到不同的城市列表取决于同一行上的 selectedCountry
    • 是的,实际上我认为您将相同的 Collection for Cities and Country 传递给每个对象。当您过滤特定国家/地区的城市时,仅将该集合传递给该集合。顺便说一句,代表 Grid 唯一行的实际对象也应该是一个集合......
    【解决方案2】:

    用两组数据创建一个视图模型,即:

    class Country_CityViewModel
    {
        public CountriesListModel { get; set; }
        public CitiesListModel { get; set; }
    
        public Country-CityViewModel()
        {
            CountriestListModel = new CountriestListModel ;
            CitiesListModel = new CitiesListModel ();
        }
    }
    

    通过绑定或后面的代码分配视图模型。

    假设您将数据分配给页面并为页面提供 CountryDetailsPage 的 x:name:

    <ComboBox x:name:"CountryDetails"
              DataContext="{Binding DataContext, ElementName=CountryDetailsPage}"
              ItemsSource="{Binding CountriesListModel.Countries}"
              DisplayMemberPath="Country"
              SelectedValue="{Binding Country.id, , Mode=TwoWay}"
              SelectedValuePath="id" />
    
    <ComboBox DataContext="{Binding DataContext, ElementName=CountryDetails}"
              ItemsSource="{Binding SelectedItem Source=CountryDetails}"
              DisplayMemberPath="City"
              SelectedValue="{Binding CitiesListModel.id, Mode=TwoWay}"
              SelectedValuePath="CountriesListModel.id" />
    

    这让我有点头晕......但试试这个逻辑。我认为它会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 1970-01-01
      • 2014-10-14
      • 2011-09-24
      • 1970-01-01
      • 2013-07-22
      相关资源
      最近更新 更多