2012-06-22 2 views
0

내가 꽤 많은 시간을 보냈어요 OnPropertyChanged를 : 내 MVVM WPF 응용 프로그램에서 정의 된 데이터 그리드를 가지고MVVM WPF 데이터 그리드의 selectedItem 바인딩 화재를 통해 아래에 설명 된 문제를 해결하기 위해 노력하고 두 번

을의는 XAML 코드를 제거 다음과 같습니다 내 컨트롤러에서

public WorkItemForUi SelectedSomeItem 
{ 
    get 
    { 
     return SomeObject.SelectedSomeItem; 
    } 
    set 
    { 
     SomeObject.SelectedSomeItem = value; 
     OnPropertyChanged("SelectedSomeItem"); 
    } 
} 

나는 다음있어 : 내 관련 뷰 모델에서

<DataGrid AutoGenerateColumns="False" Name="dgdSomeDataGrid" SelectedItem="{Binding SelectedSomeItem, Mode=TwoWay}" ItemsSource="{Binding SomeItemCollection}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Path=Id}" Header="ID" /> 
     <DataGridTextColumn Header="Titel" Binding="{Binding Path=Title}" /> 
     <DataGridTextColumn Header="Status" Binding="{Binding Path=State}" /> 
    </DataGrid.Columns> 
</DataGrid> 

내가 좋아하는 해당 속성을 가지고

private void MainWindowViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "SelectedSomeItem") 
    { 
     UpdateSelectedSomeItem(); 
    } 
} 

은 내가 일반적으로하고 싶은 것은 DataGrid에서 선택한 항목을 검색하는 것입니다, 외부 데이터 저장소 (이 경우에는 TFS)에서 항목에 대한 좀 더 많은 정보를 얻을 보여 그 텍스트 상자에 추가 정보 .

이 모든 것은 이미 예상대로 작동하지만 은 한 번이 아니라이 아니라 두 번 MainWindowViewModelPropertyChanged 메서드가 호출된다는 점에서 문제가 있습니다.

그것은이 두 번 일어날 설정되는 SelectedItem 속성에 대해 설계된 경우가 있습니다,하지만 난 내가 찾은 많은 정보가 조금 모순 (및 여부 때로는 매우 명확하지 또한으로 아주 확실하지 않다 Windows Forms 또는 WPF를 의미합니다).

나는 때문에 바인딩 내 데이터에 인 selectionchanged 이벤트 핸들러가 DataGrid에 대해 정의하고 IsSelected 속성이 사용되지만 내가 아는이 필요는 없습니다 몇 가지 제안을 보았다.

업데이트 MainWindowViewModelPropertyChanged 핸들러를 참조하는 초기화 방법이있는 MainWindowController의 일환으로.

public void Initialize(string tfsProjectCollection) 
    { 
     InitializeCommands(); 
     InitializeViewModel(); 
     AddWeakEventListener(m_MainWindowViewModel, MainWindowViewModelPropertyChanged); 
    } 

어떤 아이디어가 내 문제의 원인 일 수 있습니까?

+0

'MainWindowViewModelPropertyChanged()'는 ViewModel에서'INotifyPropertyChanged' 구현에 사용되는 ** 모든 ** 속성이 변경 될 때마다 호출됩니다. 그것은'e.PropertyName == "SelectedSomeItem"'두 호출에서 또는'e.PropertyName'에서 다른 값을 가지나요? –

+0

어떤 이유로 인해 동일한 이벤트가 두 번 올 경우를 대비해'UpdateSelectedSomeItem(); '후에'e.Handled = true'를 시도 했습니까? – Scroog1

+0

@JensH : 두 경우 모두 같습니다 ("SelectedSomeItem"). – Gorgsenegger

답변

0

좋아,이에 대한 몇 가지 더 많은 시간을 보낸 이후 우리는 문제가 ApplicationController 클래스에서 것을 발견했다. 같은 클래스의 Run 메서드도이 메서드라고도합니다.

[...] 
AddWeakEventListener(m_MainWindowViewModel, MainWindowViewModelPropertyChanged); 
[...] 

ApplicationController의 생성자에서 Initialize 메서드에 호출을 제거 :

Initialize 방법 내에서 메인 윈도우의 뷰 모델 '이벤트 리스너가 첨가 된 Initialize' 메소드의 호출이 있었다 클래스가 문제를 해결했습니다.

0

귀하의 SomeObject.SelectedSomeItem 세터도 OnPropertyChanged("SelectedSomeItem");을 모집합니까? SomeObject 유형은 무엇입니까? SomeObjectSelectedSomeItem 속성이 필요한 이유는 무엇입니까?

MainWindowViewModelPropertyChanged을 구독하는 코드도 게시하십시오.

나는 selecteditem 동작에 전혀 문제가 없었지만이 정보를 얻기 위해 INotifyPropertyChanged에 가입 할 필요가 없었습니다. 그리고 네가 그렇게 필요 없다고 생각해. 거기에 더 좋은 방법은 사이에 의사 소통을 할 수

편집 :이 작품을하지만, SomeObject 귀하의 코드에 무엇인지 모르겠다.

private WorkItemForUi _selected; 
public WorkItemForUi SelectedSomeItem 
{ 
get 
{ 
    return this._selectedSomeItem; 
} 
set 
{ 
    this._selectedSomeItem = value; 
    OnPropertyChanged("SelectedSomeItem"); 
} 
} 
+0

SomeObject는 UI에 표시하는 데 필요한 속성이 포함 된 손으로 만들어진 객체입니다. 어쩌면 내가 잘못된 방향으로 갔을 수도 있지만, DataGrid에 대한 항목 모음 하나와 컬렉션에서 SelectedItem으로 바인딩 된 다른 항목 유형 중 하나가 필요합니다. 이 SelectedItem에 대해 DataGrid에 바인딩 된 내 컬렉션의 모든 항목에 대해 미리 검색하지 않으려는 추가 데이터를 검색합니다. – Gorgsenegger