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.