Привязка WPF ComboBox к объекту при начальной загрузке - PullRequest
2 голосов
/ 16 марта 2011

У меня есть поле со списком, который связан со списком объектов модели. Я связал поле со списком SelectedItem со свойством, которое является типом модели. Вся моя привязка данных прекрасно работает после загрузки окна. SelectedItem установлен правильно, и я могу сохранить объект напрямую с хранилищем.

Проблема в том, что при первой загрузке окна я инициализирую свойство SelectedItem, и мой комбинированный список ничего не отображает. Прежде чем перейти к привязке к объектам, я привязал список строк, и это отлично работало при инициализации. Я знаю, что что-то упустил, но не могу этого понять.

Заранее благодарим за любые рекомендации, которые вы можете предоставить.

(Одно примечание о макете этой страницы. На самом деле поля со списком являются частью другого ItemTemplate, который используется в ListView. ListView связан с наблюдаемой коллекцией в главном MV. Каждый элемент этой наблюдаемой коллекции сам по себе ModelView. Это тот второй ModelView, который имеет свойство SelectedItem.)

Вот моя модель:

    public class DistributionListModel : Notifier, IComparable
    {
    private string m_code;
    private string m_description;

    public string Code
    {
        get { return m_code; }
        set { m_code = value; OnPropertyChanged("Code"); }
    }

    public string Name
    {
        get { return m_description; }
        set { m_description = value; OnPropertyChanged("Name"); }
    }

    #region IComparable Members

    public int CompareTo(object obj)
    {
        DistributionListModel compareObj = obj as DistributionListModel;
        if (compareObj == null)
            return 1;

        return Code.CompareTo(compareObj.Code);
    }

    #endregion
}

Вот соответствующий код в моем ModelView:

public MailRoutingConfigurationViewModel(int agencyID)
    : base()
{
    m_agencyID = agencyID;
    m_agencyName = DataManager.QueryEngine.GetAgencyName(agencyID);

    IntializeValuesFromConfiguration(DataManager.MailQueryEngine.GetMailRoutingConfiguration(agencyID));

    // reset modified flag
    m_modified = false;
}

private void IntializeValuesFromConfiguration(RecordCheckMailRoutingConfiguration configuration)
{
    SelectedDistributionList = ConfigurationRepository.Instance.GetDistributionListByCode(configuration.DistributionCode);
}

public DistributionListModel SelectedDistributionList
{
    get { return m_selectedDistributionList; }
    set
    {
        m_selectedDistributionList = value;
        m_modified = true;
        OnPropertyChanged("SelectedDistributionList");
    }

}

И, наконец, соответствующий XAML:

<UserControl.Resources>
        <DataTemplate x:Key="DistributionListTemplate">
            <Label Content="{Binding Path=Name}" />
        </DataTemplate>
</UserControl.Resources>
              <ComboBox 
                       ItemsSource="{Binding Source={StaticResource DistributionCodeViewSource}, Mode=OneWay}"
                       ItemTemplate="{StaticResource DistributionListTemplate}"
                                        SelectedItem="{Binding Path=SelectedDistributionList, Mode=TwoWay}"
                        IsSynchronizedWithCurrentItem="False"
                                         />

Ответы [ 2 ]

9 голосов
/ 18 марта 2011

@ SRM, если я правильно понимаю, ваша проблема связана с привязкой вашего comboBox к коллекции объектов, а не к коллекции типов значений (например, string или int, хотя строка не является типом значения). Я бы предложил добавить еще два свойства на ваш комбобокс

<ComboBox 
  ItemsSource="{Binding Source={StaticResource DistributionCodeViewSource}, 
                        Mode=OneWay}"                        
  ItemTemplate="{StaticResource DistributionListTemplate}"
  SelectedItem="{Binding Path=SelectedDistributionList, Mode=TwoWay}"
  SelectedValuePath="Code"  
  SelectedValue="{Binding SelectedDistributionList.Code }"/>

Я предполагаю, что объекты DistributionListModel идентифицируются их Кодом. Два свойства, которые я добавил SelectedValuePath и SelectedValue, помогают комбинированному списку идентифицировать, какие свойства использовать, чтобы пометить выделение ComboBoxItem с помощью всплывающего элемента управления внутри комбинированного списка. SelectedValuePath используется ItemSource и SelectedValue для TextBox.

1 голос
/ 17 марта 2011

не вызывайте ваш IntializeValuesFromConfiguration из конструктора, но после загрузки представления.

Один из способов добиться этого - создать в вашей модели представления команду, которая запускает этот метод, а затем вызватькоманда в загруженном событии.С легким инструментарием MVVM вы можете использовать поведение EventToCommand ... не знаю, какой фреймворк mvvm вы используете, но, вероятно, будет что-то подобное.

...