Привязка ComboBox к первому элементу в UWP C # - PullRequest
0 голосов
/ 25 мая 2018

Есть ли способ, когда я создаю приложение UWP, чтобы выбрать первую запись в комбинированном списке в чистом XAML?Обычно я бы установил IsSynchronizedWithCurrentItem="True", но в UWP я получаю только ошибку, что его нельзя установить.
SelectedItem не работает, только если я явно установил его на то же, что и ItemsSource с [0] после него, но затем второй ComboBox не обновляется при изменениях и снова показывает пустые записи.Вот мой код:

<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 является неправильным, поскольку он не может разрешить свойство 'RuleSubSystems' в контексте данныхтипа «объект», но после компиляции он работает хорошо (за исключением выбора первой записи).Есть ли более чистый способ привязки одного ComboBox к другому?

Объекты просты

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 голосов
/ 28 мая 2018

SelectedItem не работает, только если я явно задаю ему то же самое, что и ItemsSource с [0] после него

Вы связываете ItemsSource и SelectedItemк тому же одному свойству 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...