如何在显示页面时触发命令

时间:2015-11-20 09:13:38

标签: c# wpf mvvm

这是我的情景。

我有MainWindow frame。此框架允许我从Page1导航到Page2Page3(按任意顺序)。

我需要的是什么;当显示每个页面时,我需要一个被触发的命令

例如:

我的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来运行。

3 个答案:

答案 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上放置一个转换器。