2011-12-09 78 views
0

我瘋了,試圖找出沒有成功。綁定列表框項目使用模板

我有一個DependencyObject(「UserObject」)。它有一個「DataItems」DependecyProperty,它是一個ObservableCollection。 「UserDefiniton」是具有「Data」的DependencyProperty的DependencyObject。數據有兩個屬性:DataType(一個枚舉)和Value(一個字符串)。

我想在使用「DataItems」屬性作爲其ItemsSource的XAML中定義一個ListBox。在ItemTemplate中,我有幾個不同的控件。爲了簡化這個問題,我使用了一個CheckBox和一個TextBox。我希望CheckBox在DataType爲0時可用並可見,而我希望TextBox在DataType爲1時可用並可見。每次只能有一個控件可用並可見。

這工作:

<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屬性(複選框的布爾值會在文本框中顯示,即使該複選框被隱藏)。

基本上,雖然在這種情況下綁定工作 - 但實施是不正確的。

所以,我切換到使用模板。我遇到的問題是我無法使綁定工作。

這是我對模板的代碼。模板選擇器工作正常,但TextBox的Text屬性和複選框的財產器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> 

那麼,如何解決這個綁定?

回答

2

Content應設置爲{Binding},因爲Content將是數據模板的DataContext,因此,你應該只通過對當前DataContext。如果您需要將特定數據傳遞給模板選擇器,則可以在整個對象中進行深入查看。

還有一個template selector水平的0​​,所以你不需要內部ContentControl

(您可能也有興趣generic methods of debugging data bindings

+0

是 - 這是它。過度思考問題的一個例子。 – Russ

+0

主要問題是人們對數據綁定感到滿意,而不會拋出「硬」異常,但人們應該知道的第一個問題是:「我如何調試呢?」。 –