Wpf 绑定到ItemsControl中的CurrentItem

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

下面的XAML基本上是试图创建一个
按钮的列表(从当前
数据上下文中
视图
集合中对象的
名称
属性呈现)

单击按钮时,
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);
}