2011-12-09 2 views
0

나는 성공하지 못해서 이것을 알아 내려고 미쳤습니다.템플릿을 사용하여 ListBox 항목 바인딩하기

은 내가 DependencyObject에, ("userObject로")를 가지고있다. ObservableCollection 인 "DataItems"DependecyProperty가 있습니다. "UserDefiniton"은 DependencyProperty가 "Data"인 DependencyObject입니다. 데이터에는 DataType (열거 형)과 Value (문자열)의 두 가지 속성이 있습니다.

나는 그것의 ItemsSource로 "DataItems"속성을 사용하여 XAML에서 목록 상자를 정의하려합니다. ItemTemplate에는 여러 가지 컨트롤이 있습니다. 이 문제를 간단하게하기 위해 CheckBox와 TextBox를 사용하고 있습니다. DataType이 0 일 때 CheckBox를 사용할 수 있고 표시되도록하려면 DataType이 1 일 때 TextBox를 사용할 수 있고 표시되도록하고 싶습니다. 한 번에 하나의 컨트롤 만 사용할 수 있으며 표시 할 수 있습니다.

이 작동 :

<ListBox 
    ItemsSource={Binding DataItems, Mode=OneWay}> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <CheckBox 
        Visibility="{Binding Path=Data.DataType, Mode=OneWay, Converter={StaticResource VisibilityConverter}, ConverterParameter=0}" 
        IsChecked="{Binding Path=Data.Value, Mode=TwoWay, Converter={StaticResource StringToBoolean}}" /> 
       <TextBox 
        Visibility="{Binding Path=Data.DataType, Mode=OneWay, Converter={StaticResource VisibilityConverter}, ConverterParameter=1}" 
        Text="{Binding Path=Data.Value, Mode=TwoWay}" /> 
      </StackPanel> 
     </DataTemplate> 
    <Listbox.ItemTemplate> 
</ListBox> 

문제는 하나의 표시에도 불구하고, 모두도 체크 박스 불구하고, 텍스트 상자에 표시됩니다합니다 (Data.Value 속성을 통해 체크 박스의 부울 싸우고 있다는 것입니다 숨겨져 있습니다.)

는 기본적으로, 그래도이 경우 바인딩 작업 -하지만 구현이 잘못되었습니다.

그래서 템플릿을 사용하도록 전환했습니다. 내가 겪고있는 문제는 바인딩을 작동시키지 못한다는 것입니다.

내가 템플릿에 대해 가지고있는 코드입니다. 템플릿 선택은 제대로 작동하지만, 텍스트 상자의 텍스트 속성과 체크 박스의의 IsChecked 속성은 Data.Value에 바인딩되지 않습니다 바인딩
<DataTemplate x:Key="TextBoxItem"> 
       <TextBox 
        Text="{Binding Path=Data.Value, Mode=TwoWay}" /> 
    </DataTemplate> 
    <DataTemplate x:Key="CheckBoxItem"> 
       <CheckBox 
        IsChecked="{Binding Path=Data.Value, Mode=TwoWay, Converter={StaticResource StringToBoolean}}" /> 
    </DataTemplate> 


... 

<ListBox 
    ItemsSource={Binding DataItems, Mode=OneWay}> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <ContentControl 
       Content="{Binding Path=Data.DataType, Mode=OneWay}" 
         ContentTemplateSelector="{DynamicResource UserDefinitionTemplateSelector}"/> 

     </DataTemplate> 
    <ListBox.ItemTemplate> 
</ListBox> 

그래서 어떻게 수정합니까? Content 데이터 템플릿의 DataContext되기 때문에

답변

2

Content는 따라서 당신은 단지 현재 DataContext에 통과해야, {Binding}로 설정해야합니다. 템플릿 선택기에 특정 데이터를 전달해야하는 경우 전체 개체를 드릴 다운하면됩니다.

ListBox의 레벨에도 template selector이 있으므로 내부에 ContentControl이 실제로 필요하지 않습니다.

(당신은 또한 generic methods of debugging data bindings에 관심이있을 수 있습니다.)

+0

예 -이 그 것이었다. 문제를 과도하게 생각한 예. – Russ

+0

주된 문제는 사람들이 "어려운"예외를 throw하지 않는 데이터 바인딩에 만족한다는 것입니다. 사람들이 첫 번째 질문을 던져야한다고 생각합니다. "어떻게하면이 디버깅을 할 수 있습니까?" –