2015-01-28 2 views
0

바인딩에 약간의 문제가 있습니다. 나는 자식 컬렉션에 몇 가지 요소가있는 내 xaml에 stackpanel 있습니다. 두 번째는 스택 패널에있는 요소의 수를 보여주는 텍스트 블록이 있습니다. 그것은 처음에 대해 잘 작동 그런 식으로WPF의 요소 속성에 올바르게 바인딩하는 방법

<TextBlock Text="{Binding Children.Count, ElementName=CommentsContainer, Mode=OneWay, StringFormat=({0})}" /> 

<StackPanel x:Name="CommentsContainer"></StackPanel> 

결합에 의해 수행되지만 경우 뭔가 자식 컬렉션 dinamically TextBlock의 텍스트가 업데이트되지 않습니다을 StackPanel에 추가되었습니다. 콜렉션 카운트가 inotifypropertychange를 구현하지 않는다는 것을 의미하지만, 어떻게 적절하게 이것을 할 것인가?

+1

C# 코드를 표시 할 수 있습니까? [ObservableCollection] (http://stackoverflow.com/questions/4279185/what-is-the-use-of-observablecollection-in-net)을 컬렉션으로 사용하고 있습니까? –

+0

무슨 소리 야? 제대로 질문을 읽었습니까? StackPanel.Children은 UIElementCollection입니다. 나는 코드 내에서 StackPanel을 호출한다 .Children.Add (Element), 내 코드에서 모두 다. – Aldos

+0

'Panel'의'Children' 프라퍼티는'UIElementCollection' 타입이고 여러분이 정확하게 말하면'INotifyPropertyChanged'를 구현하지 않습니다. 따라서 'Count'속성에 대한 변경 사항은 바인딩을 통해 전파되지 않습니다. 즉, 'Count'속성에 바인딩하여 수행하려는 작업을 수행 할 수 없습니다. –

답변

4

"어떻게 이런 식으로 제대로 할 수 있습니까?" WPF의 방법은 항목 집합을 Window 또는 ViewModel 등의 속성으로 구현 한 다음 ItemsControl을 해당 컬렉션에 바인딩하는 것입니다. 예를 들어

, 당신은 문자열의 집합이 있다면 :

public ObservableCollection<string> MyItems { get; private set; } 

// elsewhere in the same class... 
MyItems = new ObservableCollection<string>(); 
MyItems.Add("first"); 
MyItems.Add("second"); 
MyItems.Add("etc"); 

ObservableCollection<T> 것 (예 : 항목을 추가하거나 제거하는 등) 컬렉션에 대한 변경의 통지로 WPF에 사용할 수있는 좋은 컬렉션 클래스 인을 컬렉션의 모든 관찰자 (예 : WPF의 바인딩 시스템)로 푸시됩니다.

보기에 이러한 항목을 보려면 (예. Window, UserControl 등), 당신은 목록에 제어 항목의 목록 ( ItemsControl에서 유래 한)와 바인드을 표시 할 수있는 컨트롤을 사용합니다 그래서 같은 속성 :
<Window ... > 
    <StackPanel> 
     <ItemsControl ItemsSource="{Binding MyItems}" /> 
     <TextBlock Text="{Binding MyItems.Count}" /> 
    </StackPanel> 
</Window> 

ObservableCollection<T>

INotifyPropertyChanged을 구현 않습니다 그래서 Count 속성은 항상 목록에있는 항목의 실제 수를 반영합니다.

물론 문자열 목록이 없어도 모든 종류의 개체가 될 수 있습니다. 마찬가지로 ItemsControl을 사용할 필요는 없지만 대신 ListBox 또는 ListView과 같은 것을 사용할 수 있습니다. 둘 다 기본 컨트롤 클래스에서 파생됩니다. 또한 의 항목의 시각적 모양을 변경하는 데 사용할 수 있으므로 data templating을 조사하는 것이 좋습니다.

+0

좋습니다. 고마워, 내 문제에 대한 해결책. 그러나 ItemsControl 대신 Grid에 이런 식으로 설정하는 방법이 있습니까? – Aldos

+0

'ItemsControl'과'Panel'은 다른 용도로 사용됩니다. 아이템 컨트롤은 레이아웃을 위해 패널을 사용하기 때문에 레이아웃 패널로 '그리드'를 사용하여 아이템 컨트롤을 가질 수 있습니다. 그러나 항목 컨트롤을 표로 바꿀 수는 없습니다. –

+0

스티븐 랜즈 (Steven Rands)는 관측 가능한 컬렉션을 설명하는 훌륭한 작업을했으며 특히 템플리트를 사용하여 훌륭한 작업을 수행했습니다. 너무 적은 코드로 이런 식으로[email protected], 자원을 전역 적으로 공유하려면 x : Shared = "false"로 설정할 수 있습니다. 그렇지 않으면 템플리트로 그리드의 자원을 지정할 수 있습니다. : 나는 보여주기 위해 함께 몇 가지 코드를 넣어 가지고

관련 문제