2010-09-18 2 views
3

intérieur TestEntryView.xaml.csItemsControl avec ItemSource réglé sur ObservableCollection de UserControls ne parvient pas à rendre dans l'arbre visuel

public partial class TestEntryView : UserControl 
{ 
    public ObservableCollection<TestFieldView> Fields {get;set;} 
    ... 
} 

où TestFieldView est un UserControl.

<UserControl x:Class="STS2Editor.View.TestEntryView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:vw="clr-namespace:STS2Editor.View" 
     mc:Ignorable="d" 
     x:Name="testEntryView" 
     d:DesignHeight="300" 
     d:DesignWidth="427" 
     d:DataContext="{Binding TestEntry, Source={StaticResource Sample}}"> 
<Grid Background="{DynamicResource ButtonNormalBorder}" TextElement.Foreground="{DynamicResource TextBrush}"> 
    <Border Background="{DynamicResource ControlBackgroundBrush}" BorderBrush="{DynamicResource ControlBackgroundBrush}" BorderThickness="4" CornerRadius="16"> 

     <Grid Margin="4" > 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition Height="*"/> 
      </Grid.RowDefinitions> 
      <ScrollViewer Background="{DynamicResource ControlBackgroundBrush}" Grid.IsSharedSizeScope="True" Grid.Row="1"> 
       <ItemsControl x:Name="fieldList" ItemsSource="{Binding Fields, ElementName=testEntryView}"/> 
      </ScrollViewer> 
     </Grid> 
    </Border> 
</Grid> 

La liaison est droite, mais quand je snoop l'arbre visuel mes articles enfants sont tous constitués d'une frontière et présentatrice du contenu, pas de visuels de l'enfant.

Répondre

2

Je peux seulement recréer votre situation si pour une raison quelconque LoadComponent n'est pas appelé sur votre UserControl (TestFieldView) et le Xaml n'est pas analysé correctement. Cela se produit dans InitializeComponent (voir par exemple What does InitializeComponent() do, and how does it work in WPF?). Êtes-vous sûr de l'appeler dans le contructor du TestFieldView?

+0

Cela a effectivement été le cas! Il y avait une surcharge qui a échoué à l'appeler, je me sens comme un imbécile maintenant! – Firoso

0

La propriété "TestEntryView.Fields" est-elle un DependencyProperty? Ou au moins déclencher un événement PropertyChanged? Ce n'était pas clair sur l'exemple ci-dessus si c'est le cas. Si ce n'est pas un DP ou ne soulève pas l'événement PropertyChanged, essayez l'un ou l'autre. C'est peut-être la solution.

EDIT:

Pour changer une propriété de dépendance, procédez comme suit:

public ObservableCollection<TestFieldView> Fields 
{ 
    get { return (ObservableCollection<TestFieldView>)GetValue(FieldsProperty); } 
    set { SetValue(FieldsProperty, value); } 
} 

public static readonly DependencyProperty FieldsProperty = 
    DependencyProperty.Register("Fields", typeof(ObservableCollection<TestFieldView>), typeof(MainWindow), 
    new UIPropertyMetadata(new ObservableCollection<TestFieldView>())); 
+0

public ObservableCollection Champs {get; set;} <- explicitement listés dans la publication! – Firoso

+1

Oui, j'ai vu ça. Je demande si c'est un DependencyProperty, ou s'il implémente INotifyPropertyChanged. – ASanch

+1

Et si ce n'est pas le cas, je dis que vous devriez essayer d'en faire une propriété de dépendance, ou le faire augmenter les notifications PropertyChanged. – ASanch

0

Êtes-vous sûr que ce soit la liaison est la connexion à des données correctes? Je préfère de beaucoup le

{Binding Fields,RelativeSource={RelativeSource TemplatedParent}} 

approche de liaison à partir d'un contrôle utilisateur, mais il devrait fonctionner de toute façon (tant que vous êtes sûr de sa liaison, il ne devrait pas d'importance (peut-être selon la façon dont vous créez une instance de votre contrôle)

vous ne semblez pas avoir un style ou DataTemplate associées à votre élément de TestFieldView ou quoi que ce soit? plus depuis que vous utilisez un ItemsControl vous avez probablement besoin de définir le ItemsPanelTemplate ainsi.

<ItemsControl Grid.Row="1" ItemsSource="{Binding Fields}"> 
    <ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <UniformGrid Rows="1" /> 
    </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <CheckBox Content="{Binding Name}" IsChecked="{Binding IsSelected}"/> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

0 Je ne suis pas sûr de ne pas voir votre code et de le déconner jusqu'à ce qu'il fonctionne, mais il est probablement utile dans le contrôle des éléments, le modèle de panneau et le modèle de données. Cependant, si je suis complètement incompréhensible, vous pourriez essayer de remplacer le ItemsControl par un ListView (car cela devrait au moins vous montrer une liste de noms de classes) qui vous donnerait une sorte d'affichage, alors vous pouvez travailler à partir de là.

+0

oh peut-être utile pour vous http://www.galasoft.ch/mydotnet/articles/article-2007041201.aspx – PJUK

Questions connexes