2014-01-08 1 views
0

문자열과 이미지가 모두 포함 된 객체를 추가하는 WPF ListView가 있습니다. 이미지는 별처럼 다른 곳에있는 객체의 내용에 따라 조건부로 표시됩니다. 내 XAML에서는 BitmapImage를 반환하는 "Brand"라는 속성에 바인딩했습니다. 항상 이미지를 표시하려고하면 모든 것이 잘됩니다. 조건부로 이미지를 표시하려고하면 (C#을 통해) ListView를 업데이트 할 수 없습니다.wpf listview 항목이 업데이트되었습니다. 속성 이벤트 핸들러가 null입니다.

내가 시도한 이미지를 표시 할 때마다 이벤트를 수동으로 트리거 할 수 있도록 ListView에 추가 된 개체에 INotifyPropertyChanged를 추가하는 것입니다. 문제는 이벤트가 항상 null이라는 것입니다. 그것은 ListView가 구독하지 않는 것과 같습니다.

<ListView Name="MyListView" Grid.Row="3" SelectionMode="Multiple"> 
     <ListView.View> 
      <GridView>      
       <GridViewColumn Header="Brand"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <Image Source="{Binding Brand}"/> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 

다음 두 줄은 내 개체를 ListView에 추가하는 방법입니다. 데이터가 파일에서 읽히고 일부 변수 설정이 생략되었습니다.

LineItem li = new LineItem(); 
MyListView.Items.Add(li); 

이것은 클래스가 다른 속성을 뺀 것과 같습니다.

public class LineItem : IComparable, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public bool PersistedBrand { get { return m_brand; } 
     set { 
      m_brand = value; 
      Brand = null; 
      //PropertyChanged(this, new PropertyChangedEventArgs("Brand")); 
     } } 

    public BitmapImage Brand 
    { 
     get 
     { 
      if (ShowBrand) 
      { 
       return s_brandImage; 
      } 
      else 
      { 
       return null; 
      } 
     } 
     set 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs("Brand")); 
      // EXCEPTION HERE ABOVE! 
     } 
    } 
} 

바인딩이 작동하는 방법에 대한 나의 이해에서 실수를하고 있습니까? 모든 제안을 부탁드립니다.

mj

편집 1 코드를 추가했습니다. 핸들러가 호출하기 전에 null의 경우

+0

이 답변으로 문제가 해결되지 않습니다,하지만 당신은 * 항상 * 이벤트 핸들러가 null 여부를 확인해야합니다 첫 번째 (요한의 대답에 따라). –

+0

뷰 모델 클래스 및/또는 XAML을 더 많이 볼 필요가 있다고 생각합니다. –

+0

코드를 업데이트했습니다. 정말 간단합니다. 주목할 가치가있는 다른 XAML 변경 사항은 화면의 다른 항목에만 관련되어 있기 때문에 주목할 가치가 없습니다. –

답변

0

확인 :

public BitmapImage Brand 
{ 
    get 
    { 
     // ... 
    } 
    set 
    { 
     if (Equals(value, _brand)) return; 
     _brand = value; 
     OnPropertyChanged(); 
    } 
} 

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    var handler = PropertyChanged; 
    if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
} 
+0

그래, 나도 알아. 하지만 왜 그것이 null입니까? –

+0

아무 것도 구독하지 않으면 null입니다. –

+1

OP가 구독자가없는 이유를 묻고 있습니다. –