繁体   English   中英

同一视图中的多个ViewModel

[英]Multiple ViewModels in same View

我想在同一视图(MainPage.xaml)中显示几个不同的ViewModel。

我对此并不陌生,不知道该怎么做。 我试图创建一个MainViewModel:

    public class MainViewModel : ViewModelBase, INotifyPropertyChanged
    {
        WeatherViewModel weatherView = new WeatherViewModel();
        ForecastViewModel forecastViewModel = new ForecastViewModel();
        DeparturesViewModel departuresViewModel = new DeparturesViewModel();
        CalenderViewModel calenderViewModel = new CalenderViewModel();
    }

    public void GetAllViews()
    {
        weatherView.GetCurrentTemp();
        forecastViewModel.GetForecastTemp();
        departuresViewModel.GetDepartures();
        calenderViewModel.GetCalender();
    }

在我的MainPage.xaml.cs中,我有以下内容:

     public MainPage()
     {
        this.InitializeComponent();
        this.DataContext = new MainViewModel();
     }

     private void Window_Loaded(object sender, RoutedEventArgs e)
     {
        var vm = this.DataContext as MainViewModel;
        vm.GetAllViews();
     }

我设法像这样单独显示每个ViewModel:

  this.DataContext = new WeatherViewModel();

但我想在同一视图中显示所有内容。

我认为您的路线正确,但是错过了一些小而重要的片段。

在您的示例代码中, MainViewModel类当前使用私有字段设置,您确实需要公共属性。 另外,如果尚未实现,我将确保ViewModelBase实现INotifyPropertyChanged 这样,从ViewModelBase派生的类都无需担心该部分。

public abstract class ViewModelBase : INotifyPropertyChanged
{
    /* INotifyPropertyChanged implementation +
       whatever other common behavior makes sense
       belongs in this class
    */
}

public class MainViewModel : ViewModelBase
{
    public WeatherViewModel Weather { get; } = new WeatherViewModel();
    public ForecastViewModel Forecast { get; } = new ForecastViewModel();
    public DeparturesViewModel Departures { get; } = new DeparturesViewModel();
    public CalendarViewModel Calendar { get; } = new CalendarViewModel();
}

在文件后面的视图代码中,您将数据上下文设置为MainViewModel的2个不同实例-一次在构造函数中,一次在Loaded事件处理程序中。 我会坚持使用构造函数版本,或者改为可以在XAML中设置数据上下文,如下所示:

<MainPage.DataContext>
    <MainViewModel>
</MainPage.DataContext>

一旦设置了主页的数据上下文并且视图模型是公共属性,那么您就可以使用绑定来访问视图模型的状态(属性),如下所示:

<TextBlock Text='{Binding Path=Weather.CurrentTempCelsius, StringFormat='Current Temp: {0}°C'}' />

同一视图中的多个ViewModel

您有很多方法可以解决。 使用x:bind拳头方式。 您可以在页面资源中初始化每个视图模型,并给它们x:Name ,然后使用x:bind来访问特定的属性,如下所示。

<Page.Resources>
    <local:CalenderViewModel x:Name="CalenderViewModel"/>
    <local:DeparturesViewModel x:Name="DeparturesViewModel"/>
    <local:ForecastViewModel x:Name="ForecastViewModel"/>
    <local:WeatherViewModel x:Name="WeatherViewModel"/>
</Page.Resources>
<Grid>
    <TextBlock Text="{x:Bind WeatherViewModel.temperature}"/>
</Grid>

另一种方法是将所有ViewModels集成到MainViewModel 而且coding.monkey提供了可以直接引用的正确解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM