Wpf Comboxbox выбираемый элемент по умолчанию - PullRequest
2 голосов
/ 22 апреля 2011

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

<ContentControl Content="{Binding Items}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <ComboBox x:Name="cb" ItemsSource="{Binding}"/>
                <TextBlock x:Name="tb" Text="--Choose One--" IsHitTestVisible="False" Visibility="Hidden"/>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                    <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

Я пробовал составную коллекцию, но, похоже, она не работает,Есть ли способ сделать это?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 22 апреля 2011

CompositeCollection должно работать, если вы знаете, как его использовать;важно помнить, что не не наследует DataContext, это означает, что вам нужно ссылаться на ваш источник другим способом, кроме того, если этот метод равен x:Reference, вы не можете создавать циклическую ссылкуэтого можно избежать, поместив коллекцию в ресурсы указанного элемента.например,

<Window.Resources>
    <CompositeCollection x:Key="compCollection">
        <ComboBoxItem Content="-- All Models --"/>
        <CollectionContainer Collection="{Binding MyCollection, Source={x:Reference Window}}"/>
    </CompositeCollection>
    ...
</Window.Resources>

Вы можете просто использовать это через ItemsSource="{StaticResource compCollection}".

2 голосов
/ 22 апреля 2011

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

что-то вроде

public class ItemViewModel
{
     public string Description { get; set; }
     public int Id { get; set; }
}

public class ViewModel : ViewModelBase
{        
    public ObservableCollection<ItemViewModel> Items { get; set; } // Bound to ContentControl

    private void Init()
    {
        Items = new ObservableCollection<ItemViewModel>();
        Items.Add(new ItemViewModel() { Description = "--choice one--" , Id = null });
        Items.AddRange(Model.Items.Select(i=> new ItemViewModel() { Description = i.Description , Id = i.Id }));
    }
}

Затем вы можете обработать Id SelectedItem с нулевой сематикой.

0 голосов
/ 22 апреля 2011

Вы можете изменить универсальный тип вашей коллекции на object и добавить туда - Все модели - вещь.

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