Как вручную добавить элемент в связанное поле со списком, но не добавить его в коллекцию? - PullRequest
0 голосов
/ 29 октября 2018

У меня есть ComboBox, у которого есть ItemSource, связанный с ObservableCollection. Я хотел бы, чтобы значение NONE было добавлено в начало Collection, только в представлении. Я не хочу добавлять это добавленное значение в связанную коллекцию, только для элементов ComboBox. Я пытался ComboBoxItems, но, похоже, это не сработало, поскольку на самом деле это не добавит.

Это мой XAML:

                        <ContentControl Content="{Binding Developer.Games}" Height="25" Width="177">
                        <ContentControl.ContentTemplate>
                            <DataTemplate>
                                <Grid>
                                    <ComboBox x:Name="cb" ItemsSource="{Binding}" DisplayMemberPath="Date"/>
                                    <TextBlock x:Name="tb" Text="Select Game" IsHitTestVisible="False" Visibility="Hidden" TextAlignment="Center" VerticalAlignment="Center"/>
                                </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>

Итак, я бы хотел, чтобы моя Коллекция выглядела так в раскрывающемся раскрывающемся списке:

NONE
Game1
Game2
Game3

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

WPF позволяет изменять значения между виртуальной машиной и представлением, используя IValueConverter. Вы можете сделать что-то вроде этого:

public class GameListEmptyOptionValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var v = value as ObservableCollection<Game>;
        v?.Insert(0, new Game() { Name = "NONE" });
        return v;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

и, для его использования, на ваш взгляд:

<Window.Resources>
    <local:GameListEmptyOptionValueConverter x:Key="GameListEmptyOptionValueConverter"/>
</Window.Resources>
<Grid>
    <ComboBox ItemsSource="{Binding ., Converter={StaticResource GameListEmptyOptionValueConverter}}" DisplayMemberPath="Name"/>
</Grid>
0 голосов
/ 30 октября 2018

Вы можете использовать CompositeCollection . Вот пример, основанный на предоставленном вами коде XAML, который добавляет ListBoxItem с текстом «NONE» в качестве первого элемента и отображает остальные объекты в модели представления.

<ComboBox x:Name="cb">
    <ComboBox.Resources>
        <CollectionViewSource x:Key="GamesCollection" Source="{Binding}"/>
    </ComboBox.Resources>
    <ComboBox.ItemsSource>
        <CompositeCollection>
            <ListBoxItem>NONE</ListBoxItem>
            <CollectionContainer Collection="{Binding Source={StaticResource GamesCollection}}"/>
        </CompositeCollection>
    </ComboBox.ItemsSource>
</ComboBox>
0 голосов
/ 29 октября 2018

Я не хочу добавлять это добавленное значение в связанную коллекцию.

Краткий ответ: то, что вы связываете со своим источником данных, это то, что вы видите из элемента управления.

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

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