wpf data-binding itemscontrol collectionviewsource currentitem

wpf - Enlace a CurrentItem en ItemsControl



data-binding collectionviewsource (2)

Creo que tienes que hacerlo manualmente en código subyacente.

XAML

<Button Click="ViewListButton_Click"> <TextBlock Text="{Binding Path=Name}" Name="txtButtonLabel" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/> </Button>

Código detrás

private void ViewListButton_Click(object sender, RoutedEventArgs e) { Button button = sender as Button; ICollectionView view = CollectionViewSource.GetDefaultView(ViewList.ItemsSource); view.MoveCurrentTo(button.DataContext); }

Si está utilizando el patrón MVVM y / o no desea utilizar código subyacente, puede vincular el Command del botón a un comando en su ViewModel, como lo sugiere Will

El XAML a continuación está básicamente tratando de hacer una lista de Button s (renderizados desde la propiedad Name de los objetos en la colección Views en el DataContext actual.

Cuando hago clic en un botón, la propiedad CurrentItem de CollectionViewSource debe cambiar y la View asociada debe mostrarse en un presentador de contenido.

DE ACUERDO. Si hago clic en el ListBox en el XAML a continuación, funciona exactamente como lo desee.

Pero, si hago clic en un botón en UniformGrid (creado por el control de elementos), la propiedad CurrentItem no se actualiza.

¿Cómo puedo actualizar CurrentItem cuando se selecciona un elemento en ItemsControl ?

Gracias

<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>


Su botón no hace nada. Por lo general, su ViewModel tendría un ICommand llamado Select (o algo similar) que el botón estaría obligado a

Command="{Binding Select, ElementName="root"}"

y pasaría la instancia al ICommand que le gustaría seleccionar

CommandParameter="{Binding}"

Se vería algo como esto (pseudocódigo c # / XAML):

public class MyModel { public string Name {get;set;} } public class MyViewModel { public ObservableCollection<MyModel> Models {get;set;} public ICommand Select {get;set;} /* configure Models and Select etc */ } <UserControl DataContext="{StaticResource MyViewModelInstance}" x:Name="root"> <ItemsControl ItemsSource="{Binding Models}"> <ItemsControl.ItemTemplate> <ItemsPanelTemplate> <Button Text="{Binding Name}" Command="{Binding Select, ElementName="root"}" CommandParameter="{Binding}"/> </ItemsPanelTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </UserControl>

ItemsControl se une a Modelos , por lo que cada modelo de modelo recibe un botón. El texto del botón está vinculado a la propiedad Nombre . El comando de botón está vinculado a la propiedad Seleccionar en el modelo de vista. Cuando se presiona el botón, llama a ICommand, enviando la instancia de MyModel a la que está vinculado el botón.

Tenga en cuenta que el uso de ViewModels dentro de un UserControl es un olor a código . UserControl s debe aparecer a los usuarios como todos los demás controles; deben tener propiedades públicas vinculables que estén vinculadas al ViewModel del usuario, no al suyo. A continuación, enlaza a los valores de estas propiedades dentro del UserControl . Para este ejemplo, tendría una propiedad ItemsSource definida en su UserControl , y ItemsControl se ItemsControl a esta propiedad en lugar de a un ViewModel directamente.