Привязка к CurrentItem в ItemsControl
XAML ниже в основном пытается составить список Button
s (предоставлено из Name
свойство объектов в Views
Коллекция в текущем DataContext
,
Когда я нажимаю на кнопку CurrentItem
собственностью CollectionViewSource
должен измениться и связанный View
должен отображаться в представителе контента.
ХОРОШО. Если я нажму в ListBox
в XAML ниже он работает именно так, как нужно.
Но, если я нажму кнопку в UniformGrid
(созданный с помощью элемента управления) CurrentItem
свойство не обновлено.
Как я могу получить CurrentItem
обновляется при выборе элемента в ItemsControl
?
Спасибо
<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>
2 ответа
Ваша кнопка ничего не делает. Обычно ваша ViewModel будет иметь ICommand с именем Select (или что-то подобное), с которой Button будет связан
Command="{Binding Select, ElementName="root"}"
и вы передадите экземпляр в ICommand, который вы хотите выбрать
CommandParameter="{Binding}"
Это будет выглядеть примерно так (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 привязывается к моделям, поэтому каждая модель в моделях получает кнопку. Текст кнопки привязан к имени свойства. Команда кнопки привязана к свойству Select в ViewModel. Когда кнопка нажата, она вызывает ICommand, отправляя в экземпляр MyModel, к которому привязана кнопка.
Обратите внимание, что использование ViewModels в UserControl
это кодовый запах. UserControl
Они должны показываться пользователям как все остальные элементы управления - они должны иметь привязываемые общедоступные свойства, которые привязаны к пользовательской ViewModel, а не к вашей. Затем вы привязываетесь к значениям этих свойств в пределах UserControl
, В этом примере у вас будет свойство ItemsSource, определенное в вашем UserControl
и ItemsControl
будет привязываться к этому свойству, а не к ViewModel напрямую.
Я думаю, что вы должны сделать это вручную в коде позади.
XAML
<Button Click="ViewListButton_Click">
<TextBlock Text="{Binding Path=Name}" Name="txtButtonLabel" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Button>
Код-за
private void ViewListButton_Click(object sender, RoutedEventArgs e)
{
Button button = sender as Button;
ICollectionView view = CollectionViewSource.GetDefaultView(ViewList.ItemsSource);
view.MoveCurrentTo(button.DataContext);
}
Если вы используете шаблон MVVM и / или не хотите использовать код позади, вы можете привязать кнопку Command
к команде в вашей ViewModel, как предложено Уиллом