Silverlight Combobox теряет визуальное значение, но сохраняет выбранное значение, когда страница на нем скрыта и отображается - PullRequest
4 голосов
/ 27 августа 2010

Я использую проект Silverlight 4.0, который использует MVVM, и у нас есть комбинированный список, который находится в представлении, и его значения и выбранное значение привязаны к наблюдаемой коллекции Организации и SelectedOrganization соответственно (оба значения существуют в модели представления),В нашем проекте страница, на которой находится этот элемент управления, может быть скрыта или показана.При первой загрузке все выглядит отлично, но когда вы переходите к другому элементу управления (скрываете вкладку с помощью элемента управления, а затем возвращаетесь к нему), значение, которое в данный момент выбрано в поле со списком, выглядит пустым, но когда я отлаживаю, выбранныйзначение все еще там.

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

Вот как объявляется комбинированный список:

<ComboBox 
    SelectedItem="{Binding SelectedOrganization, Mode=TwoWay}"
    ItemsSource="{Binding Organizations}"
    DisplayMemberPath="Name"
    Margin="5,0" 
    MinWidth="100" />

Класс для организации находится здесь:

[DataContract]
public class Organization
{
    [DataMember]
    public Guid OrganizationID { get; set; }

    [DataMember]
    public string Name { get; set; }
}

, и модель представления имеет следующий код для привязок:

public Organization SelectedOrganization
{
    get { return (Organization)GetValue("SelectedOrganization"); }
    set 
    { 
        SetValue("SelectedOrganization", value); 
    }
}

public ObservableCollection<Organization> Organizations
{
    get { return (ObservableCollection<Organization>)GetValue("Organizations"); }
    set { SetValue("Organizations", value); }
} 

Что мне нужно сделать, чтобы сохранить выбранное значение, когдаЯ переключаю родительские страницы?

Ответы [ 4 ]

1 голос
/ 02 сентября 2010

Проблема в том, что я объявил ItemsSource ПОСЛЕ SelectedItem.Видимо, это ошибка в Silverlight 3 и 4. Ответ обсуждался здесь Silverlight Combobox и SelectedItem .

0 голосов
/ 02 июля 2014

Используйте это

<ScrollViewer Grid.Row="6" Grid.ColumnSpan="4" Height="190">
                        <sdk:DataGrid Name="datagridInvestigation" 
                              AutoGenerateColumns="False" Width="650" 
                              MinHeight="180"  >
</sdk:DataGrid>
</ScrollViewer>

вместо

                            <sdk:DataGrid Name="datagridInvestigation" 
                              AutoGenerateColumns="False" Width="650" 
                              Height="180" ScrollViewer.HorizontalScrollBarVisibility="Auto" >
0 голосов
/ 10 февраля 2011

Просто быстрое замечание об ошибке SL3.

Я не воспроизводил эту ошибку в чистом окружении (поскольку я довольно много воспроизводил ошибку SL ComboBox ...), но у меня возникла проблема примерно с такой установкой:

  • ItemsSource привязывается к свойству типа List объекта X.
  • SelectedItem привязывается к свойству типа String объекта X.
  • Объект X реализует INotifyPropertyChanged.
  • SelectedItem устанавливается после ItemsSource в коде XAML, как указано выше.
  • ItemsSource установлен в TwoWay BindingMode.

Поведение : Когда пользовательские вкладки из текстового поля в поле со списком, значение поля со списком становится пустым, в то время как ViewModel сохраняет свое значение. Значение снова отображается правильно, когда пользовательская вкладка выходит из ComboBox. Обратите внимание, что значение не пропускается, если в комбинированном окне просто щелкнуть мышью, или если оно добавлено из другого комбинированного списка.

Решение : при пошаговом выполнении кода с помощью отладчика кажется, что SelectedItem возвращается перед ItemsSource, даже если ItemsSource объявлен перед SelectedItem в коде XAML.

Решением было изменить ItemSource с TwoWay BindingMode на OneWay BindingMode.

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

Br. Morten

0 голосов
/ 07 декабря 2010

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

т.е. :

public string Month{
    get {return _month;}
    set {
        if (value==null)
            return;
        _month = value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...