填充和绑定两个组合框WPF Caliburn.micro

我有这张桌子:

我在我的项目中使用这个名为NewItem的视图,在这个视图中有两个组合框.

我想这样做:
在组合框组中,存在表GROUP的所有描述,并且当我选择该描述的项目(第一组合框)时,第二组合框填充仅与我之前选择的描述相关的描述.

这是一些代码:

XAML NewItemView:

<ComboBox Height="21" HorizontalAlignment="Left" Margin="89,99,0,0" 
                  VerticalAlignment="Top" Width="106" x:Name="Group" SelectedItem="{Binding SelectedGroup}" />

ViewModel代码如下:

[Export(typeof(IScreen))]
public class NewItemViewModel : Screen
{
   public string SelectedGroup { get; set; }
   public String[] Group { get { return Groups; } }

   [..]


   //Constructor         
   public NewArticleViewModel()
   {
       Groups = GetGroups();
   }


   //Method
   private string[] GetGroups()
   {
     OleDbConnection conn = new OleDbConnection(StringConn);
     List<Group> groups = new List<Group>();

     conn.Open();
     groups = conn.Query<Group>(Q_SELECT_GROUPS,null,null).ToList();
     conn.Close();

     string[] array = new string[groups.Count];

     for (int i = 0; i < array.Length; i++)
     {
        array[i] = groups[i].Descripion;
     }

     return array;
   }
}

GROUP CLASS是:

public class Group 
{
    public int Id { get; set; }
    public string Descripion { get; set; }
}

我想指定我使用Caliburn.Micro和Dapper进行访问查询.

非常感谢 !

最佳答案 这是典型的主/细节场景,有一种典型且简单的方法可以解决它.

I.不要只在GetGroups方法中加载描述作为字符串[],而是加载enitre Group对象,或者如果有很多属性,则只创建一个只包含两个所需属性的视图模型,如下所示:

class GroupViewModel {
    public int GroupId {get; set;}
    public string Description {get; set;}
}

II.在NewItemViewModel中,为第二个ComboBox添加一个属性,比如说

class NewItemViewModel {
    private ObservableCollection<SubgroupViewModel> _subgroups;
    public ObservableCollection<SubgroupViewModel> Subgroups
    {
        get {
            if (_subgroups == null)
                _subgroups = new ObservableCollection<SubgroupViewModel>();
            return _subgroups;
        }
        set {
            _subgroups = value;
            NotifyPropertyChanged("Subgroups");
        }
    }
}

III.现在在NewItemViewModel中,属性变为如下所示:

class NewItemViewModel {
    public GroupViewModel SelectedGroup
    {
        set {
            var currentlySelected = value;
            // LOAD ALL RELATED Subgroup Descriptions FOR currentlySelected.GroupId;
            Subgroups = // LOADED Subgroup DESCRIPTIONS
        }
    }
    public ObservableCollection<GroupViewModel> Group { get { return Groups; } }
}

我希望你明白这个想法,这是方法的基本概要.我认为你可以通过利用Selectors Important Properties中的一些并使用其他技术来加载数据来改善它.

点赞