5

我有这张桌子:

在此处输入图像描述

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

在此处输入图像描述

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

这是一些代码:

XAML 新项目视图:

<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;
   }
}

组类是:

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

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

太感谢了 !

4

1 回答 1

3

这是一个典型的 Master/Detail 场景,有一种典型且简单的方法来解决它。

I.加载整个对象,或者如果有很多属性,创建一个只有两个所需属性的视图模型,而不是只加载描述作为方法string[]内部,如下所示:GetGroupsGroup

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

二、在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");
        }
    }
}

三、现在在你的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; } }
}

我希望你明白,这是该方法的基本轮廓。我认为您可以通过利用一些选择器的重要属性并使用其他技术来加载数据来稍微改进它。

于 2013-06-09T22:38:43.837 回答