Le XAML ci-dessous est essentiellement en train de faire une liste des Button
s (rendus de la propriété Name
des objets dans leReliure à CurrentItem dans un ItemsControl
collection Views
dans le DataContext
courant. Lorsque je clique sur un bouton de la CurrentItem
propriété de CollectionViewSource
doit changer et l'associé View
doit être affiché dans un présentateur contenu.
OK. Si je clique dans le ListBox
dans le XAML dessous fonctionne exactement comme vous le souhaitez.
Mais, si je clique sur un bouton dans le UniformGrid
(créé par le contrôle des éléments) la propriété CurrentItem
n'est pas mise à jour.
Comment puis-je obtenir le CurrentItem
à mettre à jour lorsqu'un élément est sélectionné dans le ItemsControl
?
Merci
<UserControl x:Class="Pos.Features.Reservation.ReservationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:product="clr-namespace:Pos.Features.ProductBrowser"
xmlns:activity="clr-namespace:Pos.Features.ActivityBrowser"
xmlns:addbysku="clr-namespace:Pos.Features.AddBySku"
xmlns:client="clr-namespace:Pos.Features.ClientBrowser"
xmlns:notes="clr-namespace:Pos.Features.Notes"
xmlns:controls="clr-namespace:Pos.Views"
xmlns:res="clr-namespace:Pos.Core;assembly=Pos.Core"
Height="300" Width="300">
<UserControl.Resources>
<DataTemplate DataType="{x:Type product:ProductBrowserViewModel}">
<product:ProductBrowserView/>
</DataTemplate>
<DataTemplate DataType="{x:Type activity:ActivityBrowserViewModel}">
<activity:ActivityBrowserView/>
</DataTemplate>
<CollectionViewSource x:Name="x" x:Key="ViewsCollection" Source="{Binding Views}" />
</UserControl.Resources>
<StackPanel>
<ListBox Name="ListBoxMenu" Grid.Column="0" Margin="5" ItemsSource="{Binding Source={StaticResource ViewsCollection}}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" Padding="10"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ContentControl Grid.Column="1" Content="{Binding ElementName=ListBoxMenu, Path=SelectedItem}"/>
<ItemsControl Grid.Column="2" Name="ViewList" ItemsSource="{Binding Source={StaticResource ViewsCollection}}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button>
<TextBlock Text="{Binding Path=Name}" Name="txtButtonLabel" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Button>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Rows="1" Columns="{Binding Views.Count}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<ContentControl Grid.Column="3" Content="{Binding Source={StaticResource ViewsCollection}, Path=CurrentItem}"/>
<Button Grid.Column="4" Click="Button_Click">dsadsd</Button>
</StackPanel>
</UserControl>
Oui, c'est ce que je fais (en mon application n'est pas dans l'exemple), mais j'ai besoin de définir une propriété comme "IsActiveView" dans chaque modèle de vue et de synchroniser les autres modèles en définissant IsActiveView = false sur chacun d'entre eux. Il commence à neiger la balle. Le ListBox dans mon exemple fait ce dont j'ai besoin. N'existe-t-il pas un moyen de synchroniser un contrôle Items avec les éléments qu'il a créés? Le seul problème avec la zone de liste est qu'elle n'est pas horozontal et qu'elle ne fait pas de zones de taille uniforme. De toute façon, j'apprécie la pensée. Je vais attendre longtemps pour voir quelles autres idées surgissent. Merci – thrag
C'est un peu difficile à saisir ce que vous essayez de faire dans votre application. Si je voulais montrer les détails d'un MyModel particulier, j'aurais une propriété publique MyModel Selected {get; set;} et je lierais un ContentControl. Vous pouvez avoir différents DataTemplates par type, donc quel que soit le type d'objet avec lequel vous vous liez sera montré en utilisant un DataTemplate différent ... – Will
OK, cela fonctionne. Mais, une question suivante; si j'ai cinq boutons sur l'écran. Chacun active une vue liée à un contenu présent (comme vous le suggérez). Je veux avoir le bouton qui représente la vue active en surbrillance. Est-il possible d'utiliser un déclencheur pour modifier la couleur des boutons en fonction de la propriété de vue "Selected". Donc, un seul bouton est toujours coloré (mis en évidence comme actif.) Il se comporterait comme un contrôle de tabulation, mais je veux besoin des boutons espacés uniformément dans le haut. (Ce qui me fait penser que je devrais voir si je pourrais changer le template de l'onglet tab pour utiliser une grille uniforme – thrag