Привязать выбранное значение в выпадающем списке, чтобы просмотреть модель - PullRequest
3 голосов
/ 12 мая 2010

У меня есть приложение silverlight, которое извлекает данные в сетку данных из модели представления.VM выставляется через Mef.У меня также есть сетка деталей, в которой есть выпадающие списки.VM также содержит данные для заполнения значений в выпадающем списке.При первой загрузке все работает нормально, и выбранные элементы в выпадающих списках верны, и я могу выбрать альтернативные значения.Однако, если я сортирую свою основную сетку данных (разрешить sort = true), я нахожу, что привязка для выбранного значения в выпадающих списках исчезает.В поле со списком все еще вводятся данные, но ничего не выбрано.

Кто-нибудь сталкивался с этой проблемой раньше?Я не уверен, как решить эту проблему.

Спасибо

Ответы [ 5 ]

1 голос
/ 23 июня 2010

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

http://blogs.msdn.com/kylemc/archive/2010/06/18/combobox-sample-for-ria-services.aspx

Кайл

0 голосов
/ 18 мая 2010

Не уверен, что вы здесь настроили, но если ваша сетка данных представляет собой список вызовов, а CurrentCall является выбранным элементом, можете ли вы не использовать привязку элементов? Э.Г.

<ComboBox x:Name="CB_Status"   
                      ItemsSource="{Binding Status}" 
                     SelectedItem="{ Path=SelectedItem.Status, Mode=TwoWay, ElementName=YOUR_DATAGRID}" 
                     ItemTemplate="{StaticResource StatusTemplate}" /> 

Я предполагаю, что текст данных сетки привязан к IEnumerable<Call> (или чему-то другому) на вашей виртуальной машине, поэтому я бы сказал, что сортировка приведет к новой коллекции (например, если вы сказали. Сортировка или порядок и т. Д.).

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

<ComboBox 
   DisplayMemberPath="DisplayName"
   SelectedItem="{Binding Path=SelectedItem.Individual.IndividualNameTitle, 
                   Mode=TwoWay, ElementName=AccountList}"
   ItemsSource="{Binding Path=IndividualNameTitles}">
</ComboBox>

Надеюсь, это поможет.

0 голосов
/ 14 мая 2010

Код для выпадающих списков следующий

 <TextBlock>Status</TextBlock>
        <ComboBox x:Name="CB_Status"   ItemsSource="{Binding Status}" SelectedValuePath="StatusId" SelectedValue="{Binding CurrentCall.StatusId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" ItemTemplate="{StaticResource StatusTemplate}" />
        <TextBlock>Priority</TextBlock>
        <ComboBox x:Name="CB_Priority"  ItemsSource="{Binding Priorities}" SelectedValuePath="PriorityId" SelectedValue="{Binding CurrentCall.PriorityId, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}" ItemTemplate="{StaticResource PriorityTemplate}"/>
        <TextBlock>Issue Type</TextBlock>
        <ComboBox x:Name="CB_IssueType" ItemsSource="{Binding IssueType}" SelectedValuePath="IssueTypeId" SelectedValue="{Binding CurrentCall.IssueTypeId, Mode=TwoWay,NotifyOnValidationError=True, ValidatesOnExceptions=True}" ItemTemplate="{StaticResource IssueTemplate}" />

Данные извлекаются из виртуальной машины, и данные запускаются с использованием асинхронных вызовов в начале, а переменные заполняются следующим образом:

   private IEnumerable<Priority> _priorities;

    public IEnumerable<Priority> Priorities
    {
        get { return _priorities; }
        set
        {
            if (value != _priorities)
            {
                _priorities = value;
                this.RaisePropertyChanged("Priorities");
            }
        }
    }
 private IEnumerable<Status> _status;

    public IEnumerable<Status> Status
    {
        get { return _status; }
        set
        {
            if (value != _status)
            {
                _status = value;
                this.RaisePropertyChanged("Status");
            }
        }
    }


    private IEnumerable<IssueType> _issueType;

    public IEnumerable<IssueType> IssueType
    {
        get { return _issueType; }
        set
        {
            if (value != _issueType)
            {
                _issueType = value;
                this.RaisePropertyChanged("IssueType");
            }
        }
    }

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

0 голосов
/ 16 мая 2010

Одна мысль и проблема, которые у меня были с SelectedValue ранее, это то, что когда combox, datagrid и т. Д. ... проходят через изменения состояния вроде; Потеря фокуса, перерисовка и некоторые другие они изменят значение SelectedValue на ноль. Возможно, что когда вы выбираете значение, SelectedValue (связанные свойства) устанавливаются на виртуальной машине. Тем не менее, когда Grid сортируется, он также указывает виртуальной машине установить SelectedValue в «null». Итак, после сортировки в комбинированных списках устанавливаются значения по умолчанию.

Что вы можете попробовать, это установить точку останова в одном из свойств SelectedValue 'set' и посмотреть, как часто устанавливается значение, во время Debug.Assert, если значение равно нулю.

0 голосов
/ 14 мая 2010

Как вы собираете данные для комбинированного списка? Это список строк или список конкретных объектов? Что может произойти, так это то, что сортировка создает другой набор объектов внутри своего комбинированного списка или каждой строки данных, и выбранный элемент больше не соответствует ссылке. Не могли бы вы опубликовать пример кода?

...