2010-06-03 8 views
3

Last Problem 발 뒤꿈치를 따라이 시간을 낭비하고 나면 프레임 워크 4가 미묘한 악마의 마스터이거나 내 PC가 귀신이 들었다고 생각하기 시작합니다.WPF Combobox 바인딩 : 선택을 변경할 수 없습니다

나는 3 개의 콤보 박스와 WPF 폼의 텍스트 박스를 가지고 있으며, Out-of-the-Box Subsonic 3 ActiveRecord DAL을 가지고 있습니다. 이 "편집 레코드"폼을로드하면 콤보 상자가 올바르게 채워지고 올바른 항목이 선택되고 텍스트 상자의 텍스트가 올바르게 입력됩니다. TextBox 텍스트를 변경하고 레코드를 저장할 수 있지만 콤보 상자는 변경할 수 없습니다. 목록이 드롭 다운되고 강조 표시되지만 항목을 클릭하면 선택한 항목이 동일하게 유지됩니다. 내가 해봤

SvcMgrDAL.Job oJob; 
IQueryable<SvcMgrDAL.JobCategory> oCategories = SvcMgrDAL.JobCategory.All().OrderBy(x => x.CategoryName); 
IQueryable<SvcMgrDAL.Asset> oAssets = SvcMgrDAL.Asset.All().OrderBy(x => x.AssetName); 
IQueryable<SvcMgrDAL.JobStatus> oStatus = SvcMgrDAL.JobStatus.All(); 

    cboCategories.ItemsSource = oCategories; 
    cboStatus.ItemsSource = oStatus; 
    cboAsset.ItemsSource = oAssets; 
    this.JobID = intJobID; 
    oJob = SvcMgrDAL.Job.SingleOrDefault(x => x.JobID == intJobID); 
    this.DataContext = oJob; 

것들 : 명시 적으로

  • 여기

    <StackPanel Orientation="Horizontal" Margin="10,10,0,0"> 
        <TextBlock Width="80">Asset</TextBlock> 
        <ComboBox Name="cboAsset" Width="180" 
         DisplayMemberPath="AssetName" 
         SelectedValuePath="AssetID" 
         SelectedValue="{Binding AssetID}" ></ComboBox> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal" Margin="10,10,0,0"> 
        <TextBlock Width="80">Status</TextBlock> 
        <ComboBox Name="cboStatus" Width="180" 
         DisplayMemberPath="JobStatusDesc" SelectedValuePath="JobStatusID" 
         SelectedValue="{Binding JobStatusID}" ></ComboBox> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal" Margin="10,10,0,0"> 
        <TextBlock Width="80">Category</TextBlock> 
        <ComboBox Name="cboCategories" Width="180" 
         DisplayMemberPath="CategoryName" 
         SelectedValuePath="JobCategoryID" 
         SelectedValue="{Binding JobCategoryID}" ></ComboBox> 
    </StackPanel> 
    <StackPanel Orientation="Horizontal" Margin="10,10,0,0"> 
        <TextBlock Width="80">Reason</TextBlock> 
        <TextBox Name="txtReason" Width="380" Text="{Binding Reason}"/> 
    </StackPanel> 
    

    내 코드의 관련 자르는 (intJobID가 전달되는)입니다 : 여기

    내 XAML의 설정 IsReadOnly="false"IsSynchronizedWithCurrentItem="True"
  • Ch 콤보 박스의 각도는 ItemSources에서 IQueryables부터 Lists까지입니다.
  • 내 자신의 작업 개체 (일반 바닐라 엔터티 클래스 INotifyPropertyChanged 사용).
  • 콤보 박스의 모든 바인딩 모드.
  • ItemsSource="{Binding}"

아음속 DAL 는 INotifyPropertyChanged를 구현하지 않지만, 이런 바인딩 간단한에 대한 필요 싶지만 나는 볼 수 없습니다. 난 그냥 드롭 다운에서 뭔가를 선택하고 그것을 저장할 수 있기를 바랍니다.

내 마지막 문제 (이 메시지의 맨 위에있는 링크)와 비교해 보면, 나는 데이터 소스가 계속 진행되는 가운데 정말 이상한 점이있는 것처럼 보입니다. 아음속일지도 모르지?

EDIT : 어떤 이유로 Set 접근자는 AssetID 속성에서만 처음으로 적용됩니다. WPF는 이제 WTF :

편집 2 향하고있다 : 바인딩 (즉, 그것은 단지 displaymemberpath하는 valuememberpath와 itemssouce를했다) 여전히 그것을하고있어 그리고 당신은 내가 삭제 한 ME-농담 돼! 첫 번째 선택을 수락 한 다음 변경되지 않습니다.

+0

'Job.AssetID'의 접근 자에 중단 점을 설정하려고 했습니까? 치는거야? 귀하가 단계를 수행하면 어떻게됩니까? 실제로 변화합니까? 어쩌면 그것은 예외를 던질 것인가? –

+0

Subsonic DAL을 사용하면 접근자를 치지 않습니다. 내 자신의 개체를 사용하는 경우에도 그것을 공격하지 않지만 빨간색 사각형이 콤보 상자 주위에 나타납니다 ... ?? – SteveCav

+0

확인하십시오 - 빨간색 예외 사각형 내 개체 (Int16 대 32)에서 형식 오류가 있습니다. 따라서 접근자가 접근 할 수 없습니다. – SteveCav

답변

1

나는 그것을 ComboBoxItems로 사용되는 Subsonic 개체로 좁혔습니다. Subsonic의 관련 부분과 정확히 동일한 코드를 사용하는 새 클래스를 만드는 경우 작동합니다. 콤보에 POCO/datatables를 사용하고 편집중인 레코드에 Subsonic을 사용하면 작동합니다. 그러나 두 가지 모두에 대해 Subsonic을 사용하는 경우에는 그렇지 않습니다.

필자는 아음속 객체를 확장하고 BLL 계층을 코딩 할 필요가 없었습니다. 내가 DAL을 위해 Subsonic을 던지거나 던지는 것에 직면 한 것처럼 보입니다. 아음속 사람들을 위해보다 구체적인 질문을 게시 할 수 있습니다.

기여한 모든 분들께 감사드립니다.

0

필드와 같은 소리가 어떻게 든 읽기 전용이거나 변경 사항이 지속되지 않습니다. 바인딩이 새 값을 설정하면 속성이 실제로 변경되었는지 확인하기 위해 속성을 다시 읽습니다. 속성이 이전 값을 반환하면 콤보 상자에서 다시 선택되어 값이 변경되지 않은 것처럼 보입니다.

DAL을 모르지만 속성 설정 코드를 단계별로 진행할 수 있습니까? 유형 변환에 문제가있을 수도 있습니다.

EDIT 빨간색 사각형에 대한 귀하의 의견을 읽으십시오. 귀하의 속성 (또는 바인딩과 관련이있는 것)이 예외를 제기하는 것처럼 들립니다. 물론 UI에서 데이터 유효성 검사를 사용하는 경우는 예외입니다. Visual Studio를 사용한다고 가정 할 때 디버거의 설정에서 '모든 예외에서 중단'을 설정할 수 있습니다.

EDIT 2 바인딩과 관련된 오류 메시지는 VS 출력 창에서 확인해야합니다. 디버깅 바인딩에 대한 자세한 정보를 제공하는 this blog post을 읽을 수도 있습니다.

+0

예외는 관련이 없으므로 해결되었습니다. 나는 "모든 예외를 깬다"고 출력을 확인했지만 아무 것도 보지 못했다. – SteveCav

+0

블로그 게시물에서 변환기 기술을 사용해 보았습니다. "반환 값 행"에 도달하지 않고 "이 메서드를 호출해서는 안됩니다."라는 예외 (Asset 콤보에만 해당)를 throw합니다. 이 값은 새로 선택된 값이 아니라 AssetID의 초기 값입니다. 나는 다음에 무엇을해야할지 모른다. – SteveCav

+0

추적 수준을 사용하여 자산 조합은 선택한 값이 아닌 기존 값을 반환합니다. 다른 콤보는 전혀 추적 반응을 일으키지 않습니다. – SteveCav

0

그것은 코드의 작은 샘플에서 말하기 어렵지만 라인을 주석 시도 :

//this.DataContext = oJob; 

을이 도움이되는지 확인합니다.

DataContext 및 ItemsSource를 설정하면 충돌이 발생할 수 있습니다.

+0

둘 다 제거한 상태에서도 여전히 작업 중입니다! – SteveCav

0

콤보 상자에 버그가 있거나 누락 된 것이있을 수있는 전역 스타일을 작성 했습니까? 아니면 콤보 박스에 순수 기본 스타일을 사용하고 있습니까? 적용된 기본 스타일을 모두 제거하십시오.

이벤트가 발생 했습니까? 귀하의 코드가 PreviewMouseLeftButtonUp와 같은 이벤트에 연결되면 이벤트가 처리 된 것으로 표시되고 아마 combobox는 무시하고 아무 것도 선택하지 않을 수 있습니다.

+0

아니, 그렇게 어리둥절 해. 스타일이 없으며 어떤 이벤트도 없습니다. 방금 SS를 다운로드하고, DAL을 생성하고, 양식을 만들고, 일부 콤보를 추가했으며, 작동하지 않습니다! – SteveCav

3

현재 선택한 항목과 선택한 항목이 새로 선택된 개체 (예 : newlyslected.Equals(previoslySelected))에서 호출 된 object.Equals() 메서드에 의해 동일한 것으로 간주되는 경우 WPF 콤보 상자는 선택한 항목을 변경하지 않습니다.

Overriding 콤보 상자 항목을 바인딩하는 클래스의 Equals method은보고있는 문제를 해결해야합니다.

1

이전 주제이지만 해결책을 찾는 데에도 동일한 문제와 어려움이있었습니다. 이것은 다른 사람을 도울 수 있습니다. WPF에서 단서가 위의 항목을 감지하지 못하여 사용자가 선택했습니다. (증상 - ComboBox_SelectionChanged 이벤트가 첫 번째 선택에서만 실행 됨)

내 시나리오 - DISTINCT 쿼리로 작성된 IList로 채워진 조회 조합. 이 경우 유일한 엔티티 ID를 포함하지 않는 일부 필드 만 반환하는 NHibernate ICriteria.SetResultTransformer를 사용하는 결과입니다.

솔루션 - 검색 후 IList를 통해 루프하고 각 엔티티에 고유 한 ID를 부여하십시오. WPF는이를 개인으로보고 적절히 행동합니다.

값 조회 만 - 그 후의 내용입니다.

'임시'엔티티는 절대로 지속되지 않습니다. 이 경우 간단한 GUI 문제를 위해 객체의 Equals 메서드를 재정의하는 것보다 더 나은 방법이었습니다. 대안은 WPF가 값 필드를 사용하여 '차이'를 결정하는 형식으로 목록을 복사하거나 변환하는 것입니다.

관련 문제