http://mobileworld.appamundi.com/blogs/andywigley/archive/2012/02/02/how-to-databind-selecteditems-of-the-listpicker-and-recurringdayspicker.aspx의 지침에 따라 다중 선택 ListPicker에서 SelectedItems를 바인딩합니다.ListSicker는 ItemsSource가 서비스에서 가져온 데이터에 바인드 될 때 선택된 항목을 체크하지 않습니다
ViewModel에서 만든 개체의 ObservableCollection에 ItemsSource를 바인딩하면 ListPicker가 문제없이 작동합니다. 그러나 WCF 서비스에서 가져온 ObservableCollection에 ItemsSource를 바인딩하면 문제가 발생합니다. ListPicker는 모든 항목을 올바르게 표시하며, 기본 화면에서 선택한 항목으로 선택하여 표시 할 수도 있습니다. 그러나 다시 선택하기 위해 선택 도구를 클릭하면 ListPicker는 템플릿에서 선택된 항목을 '틱'할 수 없습니다.
서비스에서 가져온 모든 요소의 목록을 다시 작성할 수 있지만 문제를 해결할 수있는 깔끔한 방법이 있는지 궁금합니다.
프로젝트 정보 : WP 7.0, WCF 서비스, EntityFramework, 커피를 많이
엔티티 클래스 :
DataContract(IsReference=true)]
public class TypeOfDish
{
[DataMember]
public int TypeOfDishID { get; set; }
[DataMember]
public string NameToDisplay { get; set; }
}
WCF 서비스 :
[ServiceContract]
public interface IMyService
{
[OperationContract]
[ApplyDataContractResolver]
IEnumerable<TypeOfDish> GetDishTypes();
}
XAML :
<StackPanel x:Name="DishTypeGroup" Orientation="Vertical" Width="400">
<helpers:ListPickerExtended x:Name="TypeOfDishPicker" >
ItemsSource="{Binding DishTypeList}"
SelectionMode="Multiple"
SelectedItems="{Binding SelectedDishTypes, Mode=TwoWay}"
Margin="8,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Center">
<toolkit:ListPicker.FullModeItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=NameToDisplay}" />
</DataTemplate>
</toolkit:ListPicker.FullModeItemTemplate>
</helpers:ListPickerExtended>
</StackPanel>
ListPick erExtended.cs
public class ListPickerExtended : ListPicker
{
public new IList SelectedItems
{
get
{
return (IList)GetValue(SelectedItemsProperty);
}
set
{
base.SetValue(SelectedItemsProperty, value);
}
}
}
뷰 모델은
public ObservableCollection<TypeOfDish> DishTypeList
{
get
{
//myModel.DichTypes is loaded with data from calling
//GetDishTypesAsync() on my service client
return myModel.DishTypes;
}
}
ObservableCollection<object> _selectedDishes = new ObservableCollection<object>();
public ObservableCollection<object> SelectedDishTypes
{
get { return _selectedDishes; }
set
{
if (_selectedDishes == value) { return; }
_selectedDishes = value;
RaisePropertyChanged("SelectedDishTypes");
}
}
이상하게 들리므로 일부 코드가 없으면 알 수 없습니다. –
일부 코드가 추가되었습니다. 누군가가 무엇이 잘못되었는지 파악할 수 있기를 바랍니다. – anetafr