Установка начального выбора или значения по умолчанию для поля со списком - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь установить начальное выбранное значение (или значение по умолчанию) поля со списком. Когда пользователь выбирает запись об инциденте, статус инцидента из записи об инциденте должен отображаться как выбор по умолчанию для поля со списком, а не как пустой выбор, который появляется вверху списка со списком. Я пытался:

  1. Двухстороннее связывание выбранного значения поля со списком со свойством в моей модели, а затем установка свойства по мере загрузки данных об инциденте,

  2. Двусторонняя привязка выбранного поля со списком к свойству в моей модели, а затем установка свойства при загрузке данных инцидента,

  3. Двусторонняя привязкаи поле со списком выбрало индекс и значение для свойств в моей модели, а затем установило свойства по мере загрузки данных об инциденте,

, но независимо от того, что я пытался, поле со списком все еще показываеткак это было бы изначально с пустой строкой для отображения по умолчанию в верхней части списка.

Вот XAML для ComboBox:

    <ComboBox  Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"  
    IsEnabled="{qc:Binding '!$P', P={Binding Path=Form104CModel.IsPartINA}}"
    HorizontalAlignment="Left" 
    DisplayMemberPath="Description" 
    SelectedValuePath="Code" 
    SelectedValue="{Binding Form104CModel.IncidentStatus, Mode=TwoWay}"
    SelectedIndex="{Binding Form104CModel.IncidentStatusSelectedIndex, Mode=TwoWay}"
    Margin="2,0,2,0" Name="cmbxIncidentStatus" 
    FontSize="11" FontWeight="Bold" Width="180">
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <domain:Enumeration Code="" Description="" />
            <CollectionContainer 
                 Collection="{Binding Source={x:Static infraData:CodeCache.ClearedException}}" />
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>

Вот свойства в модели, к которым привязаны выбранный индекс и выбранное значение:

  private int incidentStatusSelectedIndex;
    public int IncidentStatusSelectedIndex
   {
        get
        {
            return this.incidentStatusSelectedIndex;
        }

        set
        {
            if (this.incidentStatusSelectedIndex != value)
            {
                this.incidentStatusSelectedIndex = value;
            }
        }
    }

   private string incidentStatus;
    [CustomValidation(typeof(Form104CModel), "ValidateIncidentStatus")]
    public string IncidentStatus
    {
        get
        {
            return this.incidentStatus;
        }

        set
        {
            if (this.incidentStatus != value)
            {
                this.ValidateProperty("IncidentStatus", value);
                this.incidentStatus = value;
                this.RaisePropertyChanged("IncidentStatus");
            }
        }
    }

А вот код (из ViewModel), который устанавливает значение статуса инцидента.

              switch (rr.Incident.IncidentStatus)
                {
                    case "A":
                        this.Form104CModel.IncidentStatus = "CLEARED BY ARREST";
                        this.Form104CModel.IncidentStatusSelectedIndex = 1;
                        break;
                    case "D":
                        this.Form104CModel.IncidentStatus = "DEATH OF OFFENDER";
                        this.Form104CModel.IncidentStatusSelectedIndex = 2;
                        break;
                    case "E":
                        this.Form104CModel.IncidentStatus = "EXTRADITION DECLINED";
                        this.Form104CModel.IncidentStatusSelectedIndex = 3;
                        break;
                    case "J":
                        this.Form104CModel.IncidentStatus = "JUVENILE, NO CUSTODY";
                        this.Form104CModel.IncidentStatusSelectedIndex = 4;
                        break;
                    case "O":
                        this.Form104CModel.IncidentStatus = "OPEN";
                        this.Form104CModel.IncidentStatusSelectedIndex = 5;
                        break;
                    case "P":
                        this.Form104CModel.IncidentStatus = "PROSECUTION DECLINED";
                        this.Form104CModel.IncidentStatusSelectedIndex = 6;
                        break;
                    case "R":
                        this.Form104CModel.IncidentStatus = "REFUSED TO COOPERATE";
                        this.Form104CModel.IncidentStatusSelectedIndex = 7;
                        break;
                    case "U":
                        this.Form104CModel.IncidentStatus = "UNFOUNDED";
                        this.Form104CModel.IncidentStatusSelectedIndex = 8;
                        break;
                }

Единственное, о чем я могу думать сейчас, это то, что ComboxBox.ItemsSource каким-то образом мешает моим усилиям выбратьпо умолчанию на основе поля состояния инцидента.

Любые предложения будут высоко оценены.

1 Ответ

0 голосов
/ 08 октября 2019

Не совсем ответ, но скорее серия мыслей, слишком больших, чтобы уместиться в комментариях:

  • Связывание SelectedItem и SelectedValue часто приводит к проблемам. С SelectedItem легче справиться, связать его с наблюдаемым свойством на ВМ, и комбо будет реагировать, когда вы его установите, предполагая, что вы устанавливаете его для объекта, который существует в коллекции ItemsSource. SelectedValue обычно должен использоваться с SelectedValuePath и используется для деконструкции более сложных объектов. Этот вопрос SO дает хорошее представление о разнице.

  • Что подводит меня к ItemsSource. Я не совсем уверен, чего вы пытаетесь достичь с помощью CompositeCollection, но, похоже, он не содержит ничего, что можно было бы применить к SelectedItem.

По своей сути привязка поля со списком так же проста, как

<ComboBox ItemsSource="{Binding VMItemsSource}" SelectedItem="{Binding VMSelectedItem}"/>

Где VMItemsSource - это коллекция <Something>, а VMSelectedItem - это наблюдаемое свойство того же типа:

public ObservableCollection<Something> VMItemsSource {get; set;}

public Something VMSelectedItem
{
  get 
  {
    return this.vmSelectedItem;
  }
  set
  {
    this.vmSelectedItem = value;
    this.RaisePropertyChanged(nameof(this.VMSelectedItem));
  }
}

Затем, после создания коллекции ItemsSource, вам просто нужно ее инициализировать:

this.VMSelectedItem = this.VMItemsSource.First();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...