2014-01-28 5 views
1

저는 WPF (1 주 반)를 처음 사용하고 있습니다. 가능한 한 많이 읽고 연습했으며, 연습 문제 중 하나에서 내가 경험하지 못한 문제가 발생했습니다.ItemsControl을 명시 적으로 업데이트하는 방법

나는 ObservableCollection에 대해 이미 알고 있지만 표시가 준비되기 전에 목록에 많은 변경 사항을 적용했기 때문에 사용할 수 없다는 사실을 알려 드리고자합니다. 바인딩 명시 적 :

<ItemsControl Background="Transparent" BorderBrush="Black" BorderThickness="1" Name="elementContainer" > 
      <ItemsControl.ItemsSource> 
       <Binding UpdateSourceTrigger="Explicit" Mode="OneWay" diag:PresentationTraceSources.TraceLevel="High" /> 
      </ItemsControl.ItemsSource> 
       <ItemsControl.ItemContainerStyle> 
        <Style TargetType="ContentPresenter"> 
         <Setter Property="Canvas.Left" Value="{Binding Rect.Left}" /> 
         <Setter Property="Canvas.Top" Value="{Binding Rect.Top}" /> 
        </Style> 
       </ItemsControl.ItemContainerStyle> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <Canvas/> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
          <Rectangle Width="{Binding Rect.Width}" Height="{Binding Rect.Height}" Stroke="#FFE01313" ></Rectangle> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 

C# 코드 :

List<Rect> mData; 

DataContext = mData; 

mData.Add(new Rect(20,20,20,20)); 

var res = elementContainer.GetBindingExpression(ItemsControl.ItemsSourceProperty); 
    res.UpdateTarget(); 

하지만 내가 가진 모든이가 기록됩니다

System.Windows.Data Warning: 101 : BindingExpression (hash=44489159): GetValue at level 0 from List`1 (hash=45943265 Count=3) using <null>: List`1 (hash=45943265 Count=3) 
System.Windows.Data Warning: 80 : BindingExpression (hash=44489159): TransferValue - got raw value List`1 (hash=45943265 Count=3) 
System.Windows.Data Warning: 89 : BindingExpression (hash=44489159): TransferValue - using final value List`1 (hash=45943265 Count=3) 

내가 일시적으로 ObservableCollection에로 전환하고 내가 무엇을 놓치고, 일?

미리 감사드립니다.

+0

무엇이 질문입니까? ObservableCollection이 작동하는 이유는 무엇입니까? 아니면 ItemsControl을 명시 적으로 업데이트하여 컬렉션의 데이터를 표시하는 방법은 무엇입니까? –

+0

ItemsControl을 명시 적으로 업데이트하여 내 목록의 데이터를 표시하는 방법 – elios264

+1

원본 속성이 준비되었음을 바인딩에 알리기 위해 INOTifyPropertyChanged를 사용해야합니다. 이 예제에서 바인딩 식을 직접 조작 할 이유는 없습니다. – McGarnagle

답변

1

많이 변경해야하기 때문에 ItemsControl에 알리지 않으려면 ItemsSourcenull으로 설정 한 다음 이전 값으로 다시 설정할 수 있습니다. 컬렉션에 1000 개 이상의 항목을 삽입해야하는 경우 각 삽입 후에 WPF에서보기를 업데이트하는 것보다 더 나은 성능을 제공 할 수 있습니다.

그러나 다른 사람들이 지적한 것처럼 ObservableCollection을 먼저 사용해야합니다.

또한 INotifyCollectionChanged을 구현하는 클래스를 만들 수도 있습니다 (예 : ObservableCollection에서 상속). 컬렉션에 필요한 변경을 수행 한 다음 NotifyCollectionChangedAction.Reset으로 CollectionChanged 이벤트를 발생시킵니다. 이것은 ItemsControl이 자신을 완전히 업데이트하도록 지시합니다.

관련 문제