2011-10-10 4 views
10

사용자가 Transaction 개체를 편집하거나 삭제할 수있는 Windows Phone 7 앱에 페이지가 있습니다. Transaction 객체는 Account 클래스와 Category 클래스와 관계가있는 Linq-to-Sql 클래스입니다. 페이지에서, 나는 다음과 같이 사용자가 주어진 트랜잭션에 대한 계정과 범주를 선택할 수 있도록하기 위해 ListPicker를 사용Listpicker 오류 SelectedItem은 항상 유효한 값으로 설정되어야합니다.

<toolkit:ListPicker Grid.Row="1" FullModeHeader="Choose the Account" FullModeItemTemplate="{StaticResource FullModeItemTemplate}" ExpansionMode="FullScreenOnly" Background="#26000000" Margin="10,0,10,0" Name="Account" SelectedItem="{Binding Account, Mode=TwoWay}" Tap="ListPicker_Tap" /> 

<toolkit:ListPicker Grid.Row="7" FullModeHeader="Choose the Category" FullModeItemTemplate="{StaticResource FullModeItemTemplate}" ExpansionMode="FullScreenOnly" Background="#26000000" Margin="10,0,10,0" Name="Category" SelectedItem="{Binding Category, Mode=TwoWay}" Tap="ListPicker_Tap" /> 

ListPicker_Tap 이벤트는 WPF의 8월/2011 버전의 버그에 대한 수정이다 윈도우 폰과 Toolkit은 단순히 이것이다 :

private void ListPicker_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
    { 
     ListPicker lp = (ListPicker)sender; 
     lp.Open(); 
    } 

만약 사용자 편집 트랜잭션은 모든 괜찮지 만, 사용자가이를 삭제하려고하면, 나는 selectedItem가이 항상 설정해야합니다 "라고 말하는 오류가 유효 값 ". 여기

코드의 경우 TransactionPage.xaml.cs에서 appbar에서 삭제 버튼의 사용자 클릭 :

private void appBarDelete_Click(object sender, EventArgs e) 
    { 
     MessageBoxResult result = MessageBox.Show("Are you sure?\n", "Confirm", MessageBoxButton.OKCancel); 

     if (result == MessageBoxResult.OK) 
     { 
      App.ViewModel.DeleteTransaction(transaction); 
     } 

     NavigationService.GoBack(); 
    } 

내 ViewModel.DeleteTransaction 방법 :

public void DeleteTransaction(Transaction transaction) 
    { 
     AllTransactions.Remove(transaction); 
     transactionRepository.Delete(transaction); 
    } 

내 transactionRepository.Delete 방법 :

public void Delete(Transaction transaction) 
    { 
     Context.Transactions.DeleteOnSubmit(transaction); 
     Context.SubmitChanges(); 
    } 

Context.SubmitChanges() 실행, 트랜잭션 클래스 내부의 NotifyPropertyChanged, 나는 오류가 라인에 디버그 점은 이것이다 : 프롭퍼티에

protected virtual void SendPropertyChanged(String propertyName) 
    { 
     if ((this.PropertyChanged != null)) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

는 값이 "종류"입니다 때문이다. 그것은 개체를 삭제할 때 범주 및 계정의 propertychanged 이벤트를 보내고 listpicker가 TwoWay 모드에 있기 때문에 문제를 처리하는 것처럼 보입니다. 내가 어떻게 고칠 수 있니? 나는 도움이 필요해.

+0

당신이 전체 XAML을 첨부 할 수 있습니다 희망이 도움? 또는 너무 길면,'{Binding Account, Mode = TwoWay}'와'{Binding Category, Mode = TwoWay} '가 무엇을 가리키는 지 알면 부분적인 XAML도 괜찮을 것입니다. – Amry

답변

1

ListPickerSelectedItemListPickerItem 일 것으로 예상하는 반면 문제는 Transaction 유형의 개체에 바인딩하는 것입니다. 대신 SelectedIndex 속성에 바인딩하여 문제를 해결 한 다음 색인을 기반으로 ViewModel에서 적절한 개체를 선택할 수 있습니다. 사용자가 정의한 Tap 핸들러를 가지고있는 이유 때문에 ScrollViewer 내에 배치 할 때 ListPicker가 열리지 않는 버그의 경우도

, patch ID 10247를보십시오. 해당 패치로 툴킷을 다시 컴파일하면 문제가 해결됩니다.) 확인 itemsource가로드합니다 selectedItem가이 itemsource 뒤에 표시해야하는 경우 속성 문제의 주문 (의 프로그램에 :.

+0

'ListPicker.SelectedItem'은'ListPickerItem'뿐만 아니라 데이터 객체에도 바인딩 될 수 있습니다. – Amry

+0

@Amry 그래도 해봤습니까? 나는 똑같은 문제가 있었고'SelectedIndex'를 사용하여 해결해야만했습니다. – Praetorian

+0

'ListPicker'가 databound라면,'SelectedItem'과 함께 데이터 객체를 사용하는 것이 좋습니다. 아마도 귀하는 귀하의 사건에 대한 새로운 질문을 열 수 있습니다. :) – Amry

2

가되어 selectedItem에서 InvalidOperationException이를 던져 두 검사가 있습니다

  1. Listpicker 항목 (선언적 null의 경우
  2. Listpicker가 선택한 항목을 설정하는 항목에 같이 IndexOf를 적용한다. 그래서 필요한 경우 우선 확인이 같음을 확인하십시오. 리터에 시계

디버깅 istpicker.항목 및 오버라이드 (override)는 방법은 우리가 문제를 식별하는 데 도움이됩니다 같음

+0

참고 : 하위 속성에 바인딩하는 경우이를 초기화해야합니다. 그렇지 않으면 첫 번째 속성이 null이기 때문에 동일한 오류가 발생합니다. – kamranicus

12

이 오류는 또한 XAML 속성의 순서에 의해 발생할 수 있습니다 다음의 selectedItem가 설정되어있을 때 ItemsSource가 null이기 때문에

이 (작동하지 않는 예외를 throw) :

itemssource가 처음으로 초기화 될 때이 작동
<toolkit:ListPicker DisplayMemberPath="Title" SelectionMode="Single" 
SelectedItem="{Binding SelectedCategory, Mode=TwoWay}" 
ItemsSource="{Binding Categories}" /> 

:

<toolkit:ListPicker DisplayMemberPath="Title" SelectionMode="Single" 
ItemsSource="{Binding Categories}" 
SelectedItem="{Binding SelectedCategory, Mode=TwoWay}" /> 
+1

예, 이것은 명확하게 .NET 컨트롤의 버그입니다. 충돌없이 이러한 시나리오를 처리해야합니다. (이 문제를 염두에두고 컨트롤을 직접 디자인하십시오.) –

+0

이 솔루션은 저에게 해답입니다. –

3

ListPicker이 난을 얻을 수 Items.IndexOf를 사용 선택해야하는 항목 인스턴스의 ndex.

인스턴스가 일치하지 않으면 (컬렉션의 개체 인스턴스가 아닌 경우) IndexOf가 -1을 반환하고 "SelectedItem을 항상 유효한 값으로 설정해야합니다."라는 메시지와 함께 InvalidOperationException이 throw됩니다.

컬렉션의 항목 유형에 대한 Override Equals 메서드가 예상대로 작동합니다.

예 :

public override bool Equals(object obj) 
{ 
     var target = obj as ThisType; 
     if (target == null) 
      return false; 

     if (this.ID == target.ID) 
      return true; 

     return false; 
} 

그것이

관련 문제