2010-12-16 2 views
0

Dans un DataTemplate que je suis liaison à un viewmodel j'ai une grille comme ceci:Encapsulation mise en page répétée dans WPF

<Grid> 
. 
. <!--Row & Col Definitions...--> 
. 
<TextBlock Text="Some Label" Style="{DynamicResource TextBlockLabelStyle}" /> 
<TextBlock Grid.Column="1" Text="{Binding SomeValue, Mode=OneWay}"/> 
<Border Style="{DynamicResource SeparatorStyle}" /> 

<TextBlock Grid.Row="1" Text="Some Label" Style="{DynamicResource TextBlockLabelStyle}" /> 
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding SomeValue, Mode=OneWay}"/> 
<Border Grid.Row="1" Style="{DynamicResource SeparatorStyle}" /> 

<TextBlock Grid.Row="2" Text="Some Label" Style="{DynamicResource TextBlockLabelStyle}" /> 
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding SomeValue, Mode=OneWay}"/> 
<Border Grid.Row="2" Style="{DynamicResource SeparatorStyle}" /> 
</Grid> 

Je pensais que l'ajout de ce motif répété (TextBlock pour l'étiquette, TextBlock pour la valeur, la règle horizontale) devenait fastidieux et a pensé qu'il serait préférable de résumer en une chose UserControl comme par exemple « GridRow »:

<UserControl x:Class="GridRow"> 
    <TextBlock Text="{Binding LabelText}" Style="{DynamicResource TextBlockLabelStyle}" /> 
    <TextBlock Grid.Column="1" Text="{Binding ValueText, Mode=OneWay}"/> 
    <Border Style="{DynamicResource SeparatorStyle}" /> 
</UserControl> 

alors je pourrais juste aller quelque chose comme:

<Grid> 
    <GridRow LabelText="Some Label" ValueText="{Binding SomeValue}"/> 
    <GridRow Grid.Row="1" LabelText="Some Label2" ValueText="{Binding SomeValue2}"/> 
    <GridRow Grid.Row="2" LabelText="Some Label3" ValueText="{Binding SomeValue3}"/> 
</Grid> 

et que le contrôle utilisateur se lie aux propriétés LabelText et ValueText, peut-être via une liaison de modèle?

Ma question est comment faire ceci, et si c'est la bonne manière de le faire, ou s'il est possible d'utiliser des styles ou des datatemplates pour faire ceci?

Répondre

0

Malheureusement, c'est quelque chose qui n'est pas facile à réaliser. Une disposition Grille regarde les propriétés Grid.Row et Grid.Column de ses enfants immédiats afin de créer la disposition requise. Par conséquent, imbriquer vos contrôles d'interface utilisateur dans une autre grille va casser la mise en page.

Quelques options ce blog résout le problème, mais est complexe:

http://www.scottlogic.co.uk/blog/colin/2010/11/using-a-grid-as-the-panel-for-an-itemscontrol/

Il y a une belle grille automatique ici, je l'ai pas utilisé, mais il semble assez bon:

http://whydoidoit.com/2010/10/06/automatic-grid-layout-for-silverlight/

Cordialement, Colin E.

+0

Eh bien, il n'a pas à être dans une grille. Je pourrais aussi bien les mettre dans un panneau de cheminée vertical. Je veux juste un moyen de factoriser les éléments d'interface utilisateur Label/Value/Separator couramment utilisés mais être capable de les paramétrer. PS Ces propriétés ne font pas partie d'une collection, elles ne sont que des propriétés d'un modèle que je veux afficher de la même manière. – cjroebuck

+1

Oh, je vois. Je pense que vous devrez modifier votre modèle de vue pour envelopper ces propriétés répétées dans une classe unique, puis exposer une collection de celles-ci à partir de votre modèle de vue actuel. Vous pouvez ensuite lier cela en tant que ItemsSource d'un ItemsControl, avec le ItemControl.ItemTemplate décrivant comment rendre chaque élément. – ColinE