2013-01-07 2 views
1

런타임시 내 ListBox를 ObservableCollection에 바인딩합니다. 버튼을 클릭하면 내 컬렉션의 항목 중 하나가 수정되지만 해당 ListBox 항목은 그에 따라 업데이트되지 않습니다. 나는 몇 가지 비슷한 SO 기사 및 기타 도움말 자료를 통해 갔는데 나는 그들이 요구 한 모든 것을하고있는 것 같지만 운이 없다. 모든 것이 올바르게로드되고 바인딩되는 것처럼 보이지만 컬렉션의 항목에 "IsLoading"속성을 변경하면 IsLoading 속성에 바인딩 된 Grid의 Visibility (아래 DataTemplate 참조)가 변경되지 않습니다. 여기WPF ListBox : ObservableCollection에 바인딩

 <ListBox Name="lstItems"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid Name="ListBoxGrid"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="120"/> 
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="Auto"/> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="100"/> 
         </Grid.ColumnDefinitions> 
         <CheckBox Grid.Column="0" IsChecked="{Binding IsSelected}" /> 
         <Image Grid.Column="1" Width="50" Stretch="Uniform" Source="{Binding Image}" /> 
         <TextBlock Grid.Column="2" Text="{Binding Path=ImageFilePath}" /> 
         <Grid Grid.Column="3" Visibility="{Binding IsLoading, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True, Mode=TwoWay, BindsDirectlyToSource=True, Converter={StaticResource BooleanToVisibilityConverter1}}"> 
          <my:LoadingAnimation x:Name="SendAnimation" VerticalAlignment="Center" HorizontalAlignment="Center" /> 
         </Grid> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

그리고 내 BO의 : 다음

내옵니다의 XAML입니다

public class Order : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public bool IsSelected { get; set; } 
    public string ImageFilePath { get; set; } 
    public ImageSource Image { get; set; } 

    private bool mIsSending = false; 
    public bool IsSending 
    { 
     get { return mIsSending; } 
     set 
     { 
      mIsSending = value; 

      if (PropertyChanged != null) 
       PropertyChanged(null, new PropertyChangedEventArgs("IsSending")); 
     } 
    } 
} 

은 내가 컬렉션을 생성하고 바인딩하는 방법이 있습니다 :

ObservableCollection<Order> mOrders = new ObservableCollection<Order>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     lstItems.ItemsSource = mOrders; 
    } 
+0

BindsDirectlyToSource = False로 설정하면 어떻게됩니까? – Klaus78

+0

@ Klaus78 : 감사합니다 클라우스. 아래 내 대답을 참조하십시오. 나는 또한 다른 바인딩 속성이 필요 없다는 것을 알아 냈습니다. 따라서 Visibility = "{Binding IsSending, Converter = {StaticResource BooleanToVisibilityConverter1}}"과 같이 사용할 수 있습니다. – dotNET

답변

2

신경 끄시 고합니다. 때로는 문제를 파고 몇 시간을 보내고 마침내 좌절감을 느끼고 게시하고 2 분 후에 직접 알아낼 수 있습니다. 이후의 모든 독자에게 유일한 문제는 nullPropertyChanged 이벤트에 보냈다는 것입니다. 내가 이것을 this으로 바꾸 자마자 일들이 매력처럼 작동하기 시작했습니다.

관련 문제