2013-04-26 3 views
2

Я пытаюсь создать элемент управления, который выборочно отображает разные вещи на основе типов, которые передаются, но по какой-то причине я вообще ничего не показываю.WPF ContentControl ничего не отображает

Есть ли какая-то фундаментальная вещь, которую я здесь отсутствует? (Этот код полностью разделен с моего реального приложения производства bu, демонстрирует то же поведение)

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new List<ContactInformation> 
      { 
       new Address {Street = "21 Jump", City = "Sparta", State = "Denial"}, 
       new Phone {Number = "734-555-1212"} 
      }; 
    } 
} 

public class ContactInformation 
{ 
} 

public class Address : ContactInformation 
{ 
    public string Street { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
} 

public class Phone : ContactInformation 
{ 
    public string Number { get; set; } 
} 

<Window x:Class="ContentControlExample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:contentControlExample="clr-namespace:ContentControlExample" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ItemsControl ItemsSource="{Binding /}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <ContentControl DataContext="{Binding /}" Content="{Binding /}"> 
         <ContentControl.Resources> 
          <DataTemplate DataType="{x:Type contentControlExample:Address}"> 
           <StackPanel> 
            <TextBlock Text="{Binding Street}"/> 
            <TextBlock> 
             <TextBlock.Text> 
              <MultiBinding StringFormat="{}{0}, {1}"> 
               <Binding Path="City"/> 
               <Binding Path="State"/> 
              </MultiBinding> 
             </TextBlock.Text> 
            </TextBlock> 
           </StackPanel> 
          </DataTemplate> 
          <DataTemplate DataType="{x:Type contentControlExample:Phone}"> 
           <TextBlock Text="{Binding Number}"/> 
          </DataTemplate> 
         </ContentControl.Resources> 
        </ContentControl> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</Window> 
+0

Я не знаю, что означает '' {Binding /} "', но я не использую это. Просто измените это на '' {Binding} "'. –

+0

Я никогда не видел, чтобы привязки использовали '/', как у вас ... возможно, это связано? Быстрый способ тестирования состоял в том, чтобы просто переместить ваши DataTemplates в '' и оставить свой 'ItemsControl' как' '. По умолчанию элемент ItemsControl уже рисует ваш элемент с помощью ContentPresenter и должен использовать ваши неявные шаблоны для рисования каждого элемента. Если это не сработает, проверьте свое визуальное дерево, и это «DataContext» с помощью инструмента, такого как [Snoop] (http://snoopwpf.codeplex.com/), и это, вероятно, укажет вам в правильном направлении. – Rachel

+0

/означает текущий элемент коллекции, поэтому будет означать текущий элемент списка ContactInformation. Однако вам не нужен другой. – Phil

ответ

4

Все, что вам нужно, это удалить пару «/» следующим образом:

XAML: 

<Window x:Class="ContentControlExample.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:contentControlExample="clr-namespace:ContentControlExample" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ItemsControl ItemsSource="{Binding }"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <ContentControl DataContext="{Binding }" Content="{Binding }"> 
         <ContentControl.Resources> 
          <DataTemplate DataType="{x:Type contentControlExample:Address}"> 
           <StackPanel> 
            <TextBlock Text="{Binding Street}"/> 
            <TextBlock> 
             <TextBlock.Text> 
              <MultiBinding StringFormat="{}{0}, {1}"> 
               <Binding Path="City"/> 
               <Binding Path="State"/> 
              </MultiBinding> 
             </TextBlock.Text> 
            </TextBlock> 
           </StackPanel> 
          </DataTemplate> 
          <DataTemplate DataType="{x:Type contentControlExample:Phone}"> 
           <TextBlock Text="{Binding Number}"/> 
          </DataTemplate> 
         </ContentControl.Resources> 
        </ContentControl> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</Window> 

Кодекс позади :

namespace ContentControlExample 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = new List<ContactInformation> 
      { 
       new Address {Street = "21 Jump", City = "Sparta", State = "Denial"}, 
       new Phone {Number = "734-555-1212"} 
      }; 
     } 
    } 

    public class ContactInformation 
    { 
    } 

    public class Address : ContactInformation 
    { 
     public string Street { get; set; } 
     public string City { get; set; } 
     public string State { get; set; } 
    } 

    public class Phone : ContactInformation 
    { 
     public string Number { get; set; } 
    } 
} 

The Ouput:

Result

Я надеюсь, что это помогает.

+0

Нет, это не имеет значения. – Matt

+0

Привет, Мэтт. Я отправлю весь код и вывод, который я получаю. дайте мне сек ... – FHnainia

+0

Не знаете, какая разница, какая у меня была, но это дало мне рабочие части, которые мне были нужны. – Matt

2

Попробуйте изменить код немного. Это работает, потому что ItemsControl автоматически выбирает правильный DataTemplate в зависимости от типа привязываемого элемента.

public class ViewModel 
{ 
    public ViewModel() 
    { 
     this.Items = new List<ContactInformation> 
         { 
          new Address 
           { 
            Street = "21 Jump", 
            City = "Sparta", 
            State = "Denial" 
           }, 
          new Phone { Number = "734-555-1212" } 
         }; 
    } 

    public List<ContactInformation> Items { get; set; } 
} 

<Window.DataContext> 
    <contentControlExample:ViewModel/> 
</Window.DataContext> 
<Grid> 
    <Grid.Resources> 
     <DataTemplate DataType="{x:Type contentControlExample:Address}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Street}"/> 
       <TextBlock> 
        <TextBlock.Text> 
         <MultiBinding StringFormat="{}{0}, {1}"> 
          <Binding Path="City"/> 
          <Binding Path="State"/> 
         </MultiBinding> 
        </TextBlock.Text> 
       </TextBlock> 
      </StackPanel> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type contentControlExample:Phone}"> 
      <TextBlock Text="{Binding Number}"/> 
     </DataTemplate> 
    </Grid.Resources> 

    <ItemsControl ItemsSource="{Binding Items}"/> 
</Grid> 

Или связать текущий элемент управления содержимым:

<Grid> 
    ... resources 

    <ContentControl Content="{Binding Items/}"/> 
</Grid> 
+0

Я попытаюсь вытащить элементы из модели просмотра. Реальный производственный код не использует элемент управления элементами. То, что я действительно делаю, - это заполнение одной ячейки Infragistics XamDataGrid. Элемент ItemsControl демонстрировал такое же поведение, поэтому я использовал его в качестве примера. – Matt

+0

Как я могу видеть, ваш код не отображает никаких других результатов от моего. Все по-прежнему пусто – Matt

Смежные вопросы