Windows Phone 7 - App.ViewModel дублирует - PullRequest
1 голос
/ 02 февраля 2011
App.ViewModel.RefreshItems();
lbFruit.ItemsSource = App.ViewModel.ItemCollection;

У меня есть дубликаты в коллекции ItemsCollection.В моем списке я хотел бы только показать уникальные значения.Как бы я просто взял их для отображения?

Мне нужно показать больше данных здесь .. .

В моей коллекции у меня есть 1 набор данных, который может содержать дубликатыопределенных свойств в коллекции ..

В моей модели зрения, скажем, у меня есть фрукты и овощи в качестве свойств.

Я мог бы иметь:

ItemCollection [0] .fruit= "Apple" ItemCollection [0] .vegetable = "Carrot"

ItemCollection [1] .fruit = "Pear" ItemColection [1] .vegetable = "Морковь"

ItemCollection [2].fruit = "Apple" itemCollection [2] .vegetable = "Зеленая фасоль"

Если я хочу отображать только список фруктов в моей коллекции, как бы я сделал это без дублирования?

Например, у меня может быть несколько фруктов и овощей в моей коллекции.Если я показываю только фрукты в своем списке, как я могу показать только: Яблоко, Груша, Апельсин

Больше Код:

Когда я делаю отличное, как предложено ниже: lbFruit.ItemsSource = App.ViewModel.ItemCollection.Select (item => item.fruit) .Distinct ();

Я получаю 2 * (* - это моя пуля для списка и находится вTextBlock в DataTemplate).

Так что технически Distinct работает, но текст не отображается рядом с *.Как вы можете видеть, есть также ProductNumber, который я не показывал в исходном примере.Однако, когда я удаляю это, я все еще получаю те же 2 *.

Есть ли что-то, что мне нужно сделать на стороне XAML, чтобы сделать отличную работу?Кроме того, если бы я хотел отобразить номер продукта, как бы я добавил это к вышеприведенному выбору (если мы сможем заставить его работать)?

           <ListBox x:Name="lbFruit" ItemsSource="{Binding ItemCollection}" SelectionChanged="lbFruit_SelectionChanged">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel x:Name="DataTemplateStackPanel" Orientation="Horizontal">
                            <TextBlock FontFamily="Segoe WP Semibold" FontWeight="Bold" FontSize="30" VerticalAlignment="Top" Margin="20,10">*</TextBlock>
                            <StackPanel>
                                <TextBlock x:Name="ItemText" Text="{Binding Fruit}"  FontSize="{StaticResource PhoneFontSizeLarge}"/>
                                <TextBlock x:Name="ItemNumber" Text="{Binding ProductNumber}"  FontSize="{StaticResource PhoneFontSizeNormal}"/>
                            </StackPanel>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

Надеюсь, все это имеет смысл ... Спасибо залюбая помощь!

1 Ответ

6 голосов
/ 02 февраля 2011

Как насчет этого:

lbFruit.ItemsSource = App.ViewModel.ItemCollection.Select(item => item.fruit).Distinct();

Edit:

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

Чтобы исправить это, вам нужно использовать IEqualityComparer<T> в Distinct().

Вы не упомянули имя или определение своего класса, поэтому для следующего определения

public class ProductItem
{
    public int ProductNumber { get; set; }
    public String Fruit { get; set; }
    public String Vegetable { get; set; }
}

Вам необходимо создать IEqualityComparer<ProductItem>, например:

public class ProductItemByFruitComparer : IEqualityComparer<ProductItem>
{
    public bool Equals(ProductItem x, ProductItem y)
    {
        // Case-insensitive comparison of Fruit property of both objects evaluates equality between them
        return x.Fruit.Equals(y.Fruit, StringComparison.CurrentCultureIgnoreCase);
    }

    public int GetHashCode(ProductItem obj)
    {
        // Since we are using Fruit property to compare two ProductItems, we return Fruit's HashCode in this method
        return obj.Fruit.GetHashCode();
    }
}

А затем следующее утверждение должно сработать:

lbFruit.ItemsSource = App.ViewModel.ItemCollection.Distinct(new ProductItemByFruitComparer());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...