UWP C#中第一项的ComboBox绑定

时间:2018-05-25 09:11:08

标签: c# combobox binding uwp

当我构建一个UWP应用程序来选择纯XAML中的组合框中的第一个条目时,有没有办法?通常我会设置IsSynchronizedWithCurrentItem="True",但在UWP中我只会收到一个无法设置的错误 SelectedItem不起作用,只有当我将ItemsSource显式设置为与ComboBox后面的[0]相同时,但是第二个<ComboBox x:Name="MainSystemComboBox" ItemsSource="{Binding Path=EditRulesViewModel.RuleSet.RuleMainSystems}" SelectedItem="{Binding Path=EditRulesViewModel.RuleSet.RuleMainSystems, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" DisplayMemberPath="Name" SelectedValuePath="Id" /> <ComboBox x:Name="SubSystemComboBox" ItemsSource="{Binding Path=SelectedItem.RuleSubSystems, ElementName=MainSystemComboBox}" DisplayMemberPath="Name" SelectedValuePath="Id" /> 不会更新更改并显示空的条目再次。 这是我的代码:

Path

哦,它在设计器中向我显示第二个ComboBox的{​​{1}}是不正确的,因为它无法在'object'类型的数据上下文中解析属性'RuleSubSystems',但是编译后它运行良好(除了第一个条目的选择)。是否有更简洁的方法将ComboBox绑定到另一个?{/ p>

对象很简单

public class RuleMainSystem
{
    public string Name { get; set; }
    // Some more single properties...
    public ObservableCollection<RuleSubSystem> RuleSubSystems { get; set; }
}

public class RuleSubSystem
{
    public string Name { get; set; }
    // Some more single properties...
}

1 个答案:

答案 0 :(得分:1)

  

如果我将SelectedItem显式设置为与之后带[0]的ItemsSource相同,则它不起作用

您将ItemsSourceSelectedItem绑定到同一个属性RuleMainSystems,但这不正确。您必须将SelectedItem绑定到特定项目。例如,RuleMainSystems[0]

  

但是第二个ComboBox没有更新更新并再次显示空条目。

那是因为你没有绑定SelectedItem,你需要像下面这样做:

<ComboBox x:Name="SubSystemComboBox" 
      ItemsSource="{Binding Path=SelectedItem.RuleSubSystems, ElementName=MainSystemComboBox}" SelectedItem="{Binding Path=SelectedItem.RuleSubSystems[0], ElementName=MainSystemComboBox}"
      DisplayMemberPath="Name" SelectedValuePath="Id" />

更新于[2018/5/28]

<ComboBox x:Name="MainSystemComboBox" 
      ItemsSource="{Binding Path=RuleMainSystems}" 
      SelectedItem="{Binding Path=MySelectedItem, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
      DisplayMemberPath="Name" SelectedValuePath="Id"/>

<ComboBox x:Name="SubSystemComboBox" 
      ItemsSource="{Binding RuleSubSystems}" SelectedItem="{Binding SubSelectedItem,Mode=TwoWay}"
      DisplayMemberPath="Name" SelectedValuePath="Id" />
public class RuleMainSystem
{
    public string Name { get; set; }
    // Some more single properties...
    public ObservableCollection<RuleSubSystem> RuleSubSystems { get; set; }
}

public class RuleSubSystem
{
    public string Name { get; set; }
    // Some more single properties...
}
public MainPage()
{
    this.InitializeComponent();
    this.DataContext = new EditRulesViewModel();
}
public class EditRulesViewModel:ViewModelBase
{

    public ObservableCollection<RuleMainSystem> RuleMainSystems { get; set; }

    private RuleMainSystem _MySelectedItem;
    public RuleMainSystem MySelectedItem
    {
        get { return _MySelectedItem; }
        set
        {
            _MySelectedItem = value;
            RuleSubSystems = MySelectedItem.RuleSubSystems;
            SubSelectedItem = MySelectedItem.RuleSubSystems.FirstOrDefault();
            RaisePropertyChanged("MySelectedItem");
        }
    }


    private ObservableCollection<RuleSubSystem> _RuleSubSystems;
    public ObservableCollection<RuleSubSystem> RuleSubSystems
    {
        get { return _RuleSubSystems; }
        set
        {
            _RuleSubSystems = value;
            RaisePropertyChanged("RuleSubSystems");
        }
    }


    private RuleSubSystem _SubSelectedItem;
    public RuleSubSystem SubSelectedItem
    {
        get { return _SubSelectedItem; }
        set
        {
            _SubSelectedItem = value;
            RaisePropertyChanged("SubSelectedItem");
        }
    }


    public EditRulesViewModel()
    {
        RuleMainSystems = new ObservableCollection<RuleMainSystem>();

        ObservableCollection<RuleSubSystem> SubSystems = new ObservableCollection<RuleSubSystem>();
        SubSystems.Add(new RuleSubSystem() {Name="Sub1" });
        SubSystems.Add(new RuleSubSystem() {Name="Sub2" });

        ObservableCollection<RuleSubSystem> SubSystems1 = new ObservableCollection<RuleSubSystem>();
        SubSystems1.Add(new RuleSubSystem() { Name = "Sub3" });
        SubSystems1.Add(new RuleSubSystem() { Name = "Sub4" });

        RuleMainSystems.Add(new RuleMainSystem() {Name="Rule1",RuleSubSystems = SubSystems });
        RuleMainSystems.Add(new RuleMainSystem() { Name = "Rule2", RuleSubSystems = SubSystems1 });
        MySelectedItem = RuleMainSystems.FirstOrDefault();
    }
}