2015-05-18 68 views
0

在另一个组合框中切换选择后,我在我的窗口组合框:如何刷新组合框在WPF

<ComboBox x:Name="cbDeps" 
     ItemsSource="{Binding}" DisplayMemberPath="sName" SelectedValuePath="nDepartmentIdn" 
     Grid.Row="0" Margin="0,52,215,0" Grid.Column="1" SelectionChanged="cbUsers_SelectionChanged"/> 
<ComboBox x:Name="cbUsersDep" 
     ItemsSource="{Binding}" DisplayMemberPath="sUserName" SelectedValuePath="nUserIdn" 
     Grid.Row="0" Margin="218,52,0,0" Grid.Column="1"/> 

,我希望当我选择的第一个组合框的值,第二个由项目不仅填补的选定项目。我得到使用这种方法这些项目:

public ObservableCollection<DataModel.TB_USER> listUsersParDeps(int numDep) 
{ 
    var userDeps = (from DataModel.TB_USER ud in SessionContext.DBContext.TB_USER 
        where ud.nDepartmentIdn==numDep 
        select ud); 

    foreach (var userDep in userDeps) 
    { 
     userM.ListUserDep.Add(userDep); 
    } 

    return userM.ListUserDep; 
} 

,我把它们放在DataContext的:

cbUsersDep.DataContext = userVM.listUsersParDeps(int.Parse(cbDeps.SelectedValue.ToString())); 
+0

你能检查什么是你投入的cbUsersDep.DataContext对象的数据结构。 理想情况下,您应该这样做:从第一个组合的cbUsers_SelectionChanged提升userVM.RaisePropertyChanged(“listUsersParDeps”)。 这基本上是要求用户界面更新自己,并从财产中获取价值。 – Versatile

+0

如何检查对象的数据结构? – user2734327

+0

你可以检查这一行本身。 cbUsersDep.DataContext = userVM.listUsersParDeps(int.Parse(cbDeps.SelectedValue.ToString())); – Versatile

回答

3

除了手动设置每个组合框的数据上下文,你应该设置的数据上下文外部组件(通常是窗口,或其他一些“大”组件)到您的视图模型。然后,为两个组合框公开两个列表(理想情况下为ObservableCollection),并将组合框的ItemSource属性绑定到这些列表。然后,当你的第一个组合框的变化SelectedItem,你更新第二列表:

<StackPanel> 
    <ComboBox ItemsSource="{Binding Departments}" SelectedItem="{Binding SelectedDepartment}" /> 
    <ComboBox ItemsSource="{Binding Users}" /> 
</StackPanel> 
public class MainViewModel : INotifyPropertyChanged 
{ 
    // this holds the data 
    private Dictionary<string, List<string>> departmentUsers = new Dictionary<string,List<string>>(); 

    private List<string> departments; 
    public List<string> Departments 
    { 
     get { return departments; } 
     set 
     { 
      if (value != departments) 
      { 
       departments = value; 
       OnNotifyPropertyChanged("Departments"); 
      } 
     } 
    } 

    private string selectedDepartment; 
    public string SelectedDepartment 
    { 
     get { return selectedDepartment; } 
     set 
     { 
      if (value != selectedDepartment) 
      { 
       selectedDepartment = value; 
       OnNotifyPropertyChanged("SelectedDepartment"); 

       // update users list 
       Users = departmentUsers[selectedDepartment]; 
      } 
     } 
    } 

    private List<string> users; 
    public List<string> Users 
    { 
     get { return users; } 
     set 
     { 
      if (value != users) 
      { 
       users = value; 
       OnNotifyPropertyChanged("Users"); 
      } 
     } 
    } 

    public MainViewModel() 
    { 
     // sample data 
     departmentUsers = new Dictionary<string, List<string>>(); 
     departmentUsers.Add("Department 1", new List<string>() { "1.1", "1.2", "1.3" }); 
     departmentUsers.Add("Department 2", new List<string>() { "2.1", "2.2", "2.3", "2.4", "2.5" }); 
     departmentUsers.Add("Department 3", new List<string>() { "3.1", "3.2" }); 
     departmentUsers.Add("Department 4", new List<string>() { "4.1", "4.2", "4.3" }); 

     // initial state 
     Departments = new List<string>(departmentUsers.Keys); 
     SelectedDepartment = Departments[0]; 
    } 

    // simple INotifyPropertyChanged implementation 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnNotifyPropertyChanged(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+0

现在的问题是,当我更改部门组合值时,用户组合中的列表不会改变。它仍然有第一个值。 – user2734327

+0

它不处理用户列表中的事件 – user2734327

+0

我的代码是这样工作的;如果更改部门,则可以从第二个组合框中选择不同的用户。如果你还想听那里的改变,只需将一个新属性绑定到第二个组合框的'SelectedItem'属性。 – poke