这是我的情景。
我有MainWindow
frame
。此框架允许我从Page1
导航到Page2
到Page3
(按任意顺序)。
我需要的是什么;当显示每个页面时,我需要一个被触发的命令
例如:
我的3个页面都有DataGrids
。
mc:Ignorable="d"
Title="Page1">
<DataGrid DataContext="{Binding Source={x:Static VM:ViewModel.Instance}}"
ItemsSource="{Binding CustomerCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
RowDetailsVisibilityMode="VisibleWhenSelected"
AutoGenerateColumns="True">
</DataGrid>
这些DataGrids绑定到同一ObservableCollection
(static)
中的同一“客户”ViewModel
。
public ObservableCollection<customer> CustomerCollection
{
get
{
return _customercollection;
}
set
{
_customercollection = value;
OnPropertyChanged("CustomerCollection");
}
}
这意味着在任何给定的时间点,每个页面都显示相同的Customer
信息。
现在我希望Page1
显示活跃客户,Page2
以显示已暂停的客户,并Page3
显示辞职的客户。
我需要在每个页面的ViewModel
中触发不同的查询。每个查询都特定于页面。
但是,当我在页面之间导航时,如何自动触发此查询?
这里的想法是限制使用多少内存 应用程序通过回收相同的
ObservableCollections
来运行。
答案 0 :(得分:3)
我认为您可以将命令绑定到每个页面的已加载事件并传递命令参数,具体取决于您可以选择可观察的集合。
<Window x:Class="V_Parcel.SplashPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:CommandClass="clr-namespace:V_Parcel"
xmlns:prop="clr-namespace:V_Parcel.Properties"
xmlns:vm="clr-namespace:V_Parcel"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding StartButton}" CommandParameter="1" />
</i:EventTrigger>
</i:Interaction.Triggers>
答案 1 :(得分:2)
查看模型是一种准备数据以便在视图中轻松显示的东西 您需要过滤数据 - 因此,请在视图模型中的某处进行过滤。
一种方法是在同一个视图模型中隐藏CustomerCollection
并制作collection views(但最好每页保持一个单独的视图模型):
public class ViewModel
{
private ObservableCollection<Customer> _customercollection;
private void LoadCustomers()
{
_customercollection = // load customers somehow;
ActiveCustomers = new ListCollectionView(_customercollection)
{
Filter = c => ((Customer)c).IsActive
};
OnPropertyChanged("ActiveCustomers");
// almost the same code for SuspendedCustomers and ResignedCustomers
}
public ICollectionView ActiveCustomers { get; private set; }
private ICollectionView SuspendedCustomers { get; private set; }
private ICollectionView ResignedCustomers { get; private set; }
// rest of code
}
XAML:
<DataGrid ItemsSource="{Binding ActiveCustomers}"/>
请注意,您可以使用延迟初始化来创建这些属性(因此,可以根据需要创建适当的集合视图)。
答案 2 :(得分:0)
您可以使用NavigationService上的事件来设置您的视图模型。更多 - 更好 - 有关NavigationService的信息:http://paulstovell.com/blog/wpf-navigation
您还可以尝试在每个过滤集合的ItemSource上放置一个转换器。