Вместо того, чтобы привязать данные 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; }
}