Wpf 绑定到ItemsControl中的CurrentItem
下面的XAML基本上是试图创建一个Wpf 绑定到ItemsControl中的CurrentItem,wpf,data-binding,itemscontrol,collectionviewsource,currentitem,Wpf,Data Binding,Itemscontrol,Collectionviewsource,Currentitem,下面的XAML基本上是试图创建一个按钮的列表(从当前数据上下文中视图集合中对象的名称属性呈现) 单击按钮时,CollectionViewSource的CurrentItem属性应该更改,相关的视图应该显示在内容演示器中 好的。如果我单击下面XAML中的列表框,它将完全按照需要工作 但是,如果单击UniformGrid(由items控件创建)中的按钮,CurrentItem属性不会更新 在ItemsControl中选择项目时,如何更新CurrentItem 谢谢 <UserControl x
按钮的列表(从当前数据上下文中视图
集合中对象的名称
属性呈现)
单击按钮时,CollectionViewSource
的CurrentItem
属性应该更改,相关的视图应该显示在内容演示器中
好的。如果我单击下面XAML中的列表框
,它将完全按照需要工作
但是,如果单击UniformGrid
(由items控件创建)中的按钮,CurrentItem
属性不会更新
在ItemsControl
中选择项目时,如何更新CurrentItem
谢谢
<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>
dsadsd
您的按钮不起任何作用。通常,您的ViewModel会有一个名为Select(选择)的ICommand(或类似命令),按钮将绑定到该命令上
Command=“{Binding Select,ElementName=“root”}”
然后将实例传递给要选择的ICommand
CommandParameter=“{Binding}”
它看起来像这样(类似c#/XAML的伪代码):
public类MyModel{public string Name{get;set;}
公共类MyViewModel
{
公共可观测集合模型{get;set;}
公共ICommand选择{get;set;}
/*配置模型并选择等*/
}
ItemsControl绑定到Models,因此Models中的每个MyModel都会获得一个按钮。按钮文本绑定到属性名称。按钮命令绑定到ViewModel中的Select属性。按下按钮时,它会调用ICommand,并发送i命令按钮绑定到的MyModel的状态
请注意,在UserControl
中使用ViewModels是一种代码味道UserControl
s应该像所有其他控件一样向用户显示--它们应该具有绑定到用户的ViewModel的可绑定公共属性,而不是您的。然后,您可以绑定到UserCo中这些属性的值control
。在本例中,您将在UserControl
上定义一个ItemsSource属性,ItemsControl
将绑定到此属性,而不是直接绑定到ViewModel。我认为您必须在代码隐藏中手动执行此操作
XAML
<Button Click="ViewListButton_Click">
<TextBlock Text="{Binding Path=Name}" Name="txtButtonLabel" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="Black"/>
</Button>
如果您正在使用MVVM模式和/或您不想使用代码隐藏,您可以将按钮的命令
绑定到ViewModel中的命令,正如Will所建议的那样是的,这就是我正在做的(在我的应用程序中,而不是在示例中),但是我需要设置一个类似“IsActiveView”的属性在每个视图模型中,并通过在每个视图模型上设置IsActiveView=false来保持其他视图模型的同步。它开始滚雪球。我的示例中的列表框满足了我的需要。是否有办法使Items控件与它创建的项保持同步?列表框的唯一问题是它不是水平的,并且它没有使控件保持一致大小区域。无论如何,我很欣赏这个想法。我会等很长时间,看看还有什么其他想法出现。很难理解你在应用程序中尝试做什么。如果我想显示特定MyModel的详细信息,我会选择一个公共MyModel{get;set;}属性,我会将ContentControl绑定到它。每种类型都可以有不同的DataTemplates,所以绑定到的任何类型的对象都将使用不同的DataTemplate显示…好的,这很有效。但是,如果我在屏幕上有五个按钮,那么接下来的问题是。每个按钮都会激活绑定到当前内容的视图(如您所建议的)。我希望突出显示表示活动视图的按钮。是否有一种方法可以使用触发器根据“选定”视图属性更改按钮的颜色。因此,只有一个按钮被着色(突出显示为活动)。它的行为类似于选项卡控件,但我希望按钮在顶部均匀分布。(这让我觉得我应该看看是否可以改变tab控件的模板以使用统一的网格。这可能比仅仅在ViewModel上设置公共属性以指示哪个按钮应该高亮显示要困难得多,然后使用绑定到该公共属性的样式DataTrigger来打开和关闭高亮显示…public枚举突出显示{ViewA、ViewB、ViewC、ViewD}
<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);
}