2010-02-25 4 views
3

저는 WPF 및 바인딩으로 시작하지만 이해가되지 않는 이상한 동작이 있습니다. WPF 바인딩 질문

Exemple 1

: 하나의 콤보 상자 (이름 = C) 생성자에 다음 코드와 아주 간단한 WPF 양식 :이이 때문에 충돌 이유
public Window1() 
    { 
     InitializeComponent(); 

     BindingClass ToBind = new BindingClass(); 
     ToBind.MyCollection = new List<string>() { "1", "2", "3" }; 

     this.DataContext = ToBind; 

     //c is the name of a combobox with the following code : 
     //<ComboBox Name="c" SelectedIndex="0" ItemsSource="{Binding Path=MyCollection}" /> 
     MessageBox.Show(this.c.SelectedItem.ToString()); 
    } 

당신이 날 설명 할 수 있습니다. c.SelectedItem이 NULL입니다.

그래서

그래도 난 ... 그것은 생성자에 있기 때문에 그것의 문제는,의는로드 형태의 이벤트에 코드를 넣어주지 :

 public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     BindingClass ToBind = new BindingClass(); 
     ToBind.MyCollection = new List<string>() { "1", "2", "3" }; 
     this.DataContext = ToBind; 
     MessageBox.Show(this.c.SelectedItem.ToString()); 
    } 

같은 문제 this.c.SelectedItem가 null ...

비고 : Messagebox를 제거하면 바인딩 작업이 정상적으로 작동하며 콤보 상자에 값이 있습니다. datacontext가 설정된 후 "약간의"시간이 필요한 것과 같습니다. 하지만 바인딩이 완료 될 때를 아는 방법은 무엇입니까?

Tx 도움을 요청합니다.

답변

2

이것은 선택 변경이 아직 트리거되지 않았으므로 selecteditem이 여전히 null이기 때문입니다.

private void c_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    MessageBox.Show(this.c.SelectedItem.ToString()); 
} 

WPF를 처음 사용한다면 MVVM 패턴을 살펴 보시기 바랍니다. 여기 정말 좋은 소개 영상 있습니다 :

BindingClass ToBind = new BindingClass(); 
    public Window1() 
    { 
     InitializeComponent(); 
     ToBind.MyCollection = new List<string>() { "1", "2", "3" }; 

     this.DataContext = ToBind; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show(this.c.SelectedItem.ToString()); 
    } 

을 그래서 여기, 그렇지 않은 경우에도 : 주석에 대한 http://blog.lab49.com/archives/2650

+0

지옥, 사실 그것은 선택된 항목 이상입니다. 즉 null입니다. 콤보 상자는 전혀 바인딩되지 않은 것처럼 반응합니다 (항목도 null 임). 이것은 실버 라이트에서 작동하기 때문에 호기심이 많았습니다. 3 – Fabian

+0

네, 그걸 확인하는 것을 괴롭히지 않았습니다 : P. 이상한 것은 실버 라이트에서는 작동하지만 wpf에서는 작동하지 않습니다. 어쩌면 그들은 컨트롤을로드하는 다른 방법을 가지고 있을지도 모릅니다. 컨트롤 자체를 렌더링하기 전에 OnContentRendered 및 MyCollection이 설정되었는지 확인했습니다. 시간이별로 없지만 빨간색 게이트 .net reflector는 .net 프레임 워크에서 무슨 일이 일어나는지 살펴볼 수있는 훌륭한 도구입니다. WPF로 많은 이상한 것을 발견 할 수있게 도와주었습니다. 잘못된 답변을 드려 죄송 합니다만, MVVM을 WPF 응용 프로그램을 개발하는 데 정말 좋은 패턴으로 생각해 주시기 바랍니다. – Michael

+0

Tx 당신 Michael, 저는 WPF에 Silverlight 3 프로젝트 형태를 옮기고 있습니다. 언뜻보기에는 꽤 쉬워 보입니다. 그러나 그들 사이의 괴상한 차이가있어 매우 복잡합니다. :) – Fabian

0

바인딩은 Window_Loaded 이벤트 중에 발생하지만 scren에는 그려지지 않으므로 SelectedItem이 아직 없습니다.

Binding 또는 DataContext 등의 PropertyChanged 이벤트를 청취해야합니다. 그런 다음 OnPropertyChanged 메시지 상자를 가져 오십시오

0

텍사스, 내가 이것을 시도, 이것은 작동하고,이 같은해야한다 화면에 그려진 항목은 이미 가져온 것입니다 ... 아주 이상합니다.