Обновление и фильтрация списка - PullRequest
2 голосов
/ 03 июля 2011

У меня есть два средства выбора списков с одинаковой привязкой данных (из XML). При изменении первого средства выбора списков необходимо отфильтровать данные второго средства выбора списков и скрыть элемент, выбранный в первом средстве выбора списков, так же, как и второе средство выбора списков.

2средство выбора списка XAML ...

<my:ListPicker HorizontalAlignment="Left" 
                        x:Name="listPicker1" Width="265" BorderBrush="{x:Null}" FontFamily="Segoe UI" FontSize="18.667" Background="{StaticResource PhoneTextBoxBrush}" ScrollViewer.VerticalScrollBarVisibility="Visible" Margin="147,0,0,0" Grid.Row="1" Foreground="#FF1BA1E2" Height="35" SelectionChanged="listPicker1_SelectionChanged" >
                        <my:ListPicker.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Width="360" Height="34">
                                    <TextBlock x:Name="item" Text="{Binding ChannelName, Mode=TwoWay}" FontSize="18.667" Margin="12, 0, 2, 2" />
                                </StackPanel>
                            </DataTemplate>
                        </my:ListPicker.ItemTemplate>
                    </my:ListPicker>
                    <TextBlock TextWrapping="Wrap" FontFamily="Segoe UI" FontSize="16" Margin="52,5,0,5" Grid.Row="3" HorizontalAlignment="Left" Width="91" Text="Channel 2 "/>
                    <my:ListPicker HorizontalAlignment="Left" 
                        x:Name="listPicker2" Width="265" BorderBrush="{x:Null}" FontFamily="Segoe UI" FontSize="18.667" Background="{StaticResource PhoneTextBoxBrush}" Foreground="#FF1BA1E2" ScrollViewer.VerticalScrollBarVisibility="Visible" Margin="147,0,0,0" Grid.Row="3" SelectionChanged="listPicker2_SelectionChanged" >
                        <my:ListPicker.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Width="360" Height="34">
                                    <TextBlock x:Name="item" Text="{Binding ChannelName, Mode=TwoWay}" FontSize="18.667" Margin="12, 0, 2, 2" />
                                </StackPanel>
                            </DataTemplate>
                        </my:ListPicker.ItemTemplate>
                    </my:ListPicker>

Привязка данных с кодом XML

    public Customize()
    {
        InitializeComponent();

        XDocument loadedData = XDocument.Load("newsChannels.xml");

        var channels = from query in loadedData.Descendants("channel")
                       select new Channels
                       {
                           ChannelName = (string)query.Element("channelname"),
                       };
        listPicker1.ItemsSource = channels;
        listPicker2.ItemsSource = channels;
    }

    public class Channels
    {
        string channelname;

        public string ChannelName
        {
            get { return channelname; }
            set { channelname = value; }
        }
    }

1 Ответ

1 голос
/ 05 июля 2011

Вместо того, чтобы привязать данные ListPickers к одному и тому же списку, попробуйте создать 2 свойства прокси, которые управляют доступом к базовому списку.Затем можно получить средство получения свойств прокси, чтобы отфильтровать все, что было выбрано для другого списка (при условии, что связанный объект также связан с моделью представления. В качестве альтернативы (или, возможно, в дополнение) можно использовать событие SelectionChanged, чтобы принудительно обновитьв списки прокси.

Обновление Вот пример:

Предполагается, что страница содержит это:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel>
        <toolkit:ListPicker x:Name="picker1" 
                            ItemsSource="{Binding List1, Mode=TwoWay}"
                            SelectedItem="{Binding SelectedItem1, Mode=TwoWay}" 
                            SelectionChanged="ListPicker1SelectionChanged" />
        <toolkit:ListPicker x:Name="picker2"
                            ItemsSource="{Binding List2, Mode=TwoWay}"
                            SelectedItem="{Binding SelectedItem2, Mode=TwoWay}"
                            SelectionChanged="ListPicker2SelectionChanged" />
    </StackPanel>
</Grid>

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

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();

        this.DataContext = new TwoListViewModel();
    }

    private void ListPicker1SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // Ensure that the selected Item is updated
        picker1.GetBindingExpression(ListPicker.SelectedItemProperty).UpdateSource();

        // rebind the other list
        var binding = picker2.GetBindingExpression(ListPicker.ItemsSourceProperty).ParentBinding;
        picker2.SetBinding(ListPicker.ItemsSourceProperty, binding);
    }

    private void ListPicker2SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        picker2.GetBindingExpression(ListPicker.SelectedItemProperty).UpdateSource();

        var binding = picker1.GetBindingExpression(ListPicker.ItemsSourceProperty).ParentBinding;
        picker1.SetBinding(ListPicker.ItemsSourceProperty, binding);
    }
}

public class TwoListViewModel
{
    public TwoListViewModel()
    {
        // MUST Initialize the selected items
        SelectedItem1 = "one";
        SelectedItem2 = "two";
    }

    private IEnumerable<string> InnerList
    {
        get
        {
            return new[]
                   {
                       "one",
                       "two",
                       "three",
                       "four",
                       "five",
                   };
        }
    }

    public IEnumerable<string> List1
    {
        get
        {
            return InnerList.Where(item => item != SelectedItem2);
        }
    }

    public IEnumerable<string> List2
    {
        get
        {
            return InnerList.Where(item => item != SelectedItem1);
        }
    }

    public string SelectedItem1 { get; set; }

    public string SelectedItem2 { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...