MVVM - 如何以编程方式为我的viewmodel选择视图?

时间:2009-10-06 04:33:57

标签: wpf mvvm

如何在不使用代码的情况下为我的viewmodel选择视图?我想加载一个包含来自WCF调用的大量数据的ListBox。使用Josh Smith的应用程序,视图在数据到达之前加载,为空。我想接收所有数据,然后选择带有微调器显示进度的视图。

// Completed Method
void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    DataTemplate dataTemplate = new DataTemplate();
    //Leaderboards_All_View lb_all_view = new Leaderboards_All_View();
    CollectionViewSource collViewSrc = new CollectionViewSource();
    dataTemplate.DataType = "Leaderboards_All_View";
    List<Leaderboards_All> leaderboardList = e.Result as List<Leaderboards_All>;

    allViewModel =
    (from lbData in leaderboardList
     select new LB_Data_All_ViewModel(lbData, lb_All_ViewModel)).ToList();

    foreach (LB_Data_All_ViewModel avm in allViewModel)
    avm.PropertyChanged += this.OnLB_Data_All_ViewModelPropertyChanged;

    this.AllViewModel = new ObservableCollection<LB_Data_All_ViewModel>(allViewModel);
    this.AllViewModel.CollectionChanged += this.OnCollectionChanged;
    collViewSrc.Source = AllViewModel;
    lb_all_view.DataContext = collViewSrc;
}

2 个答案:

答案 0 :(得分:3)

- 如何在不使用代码的情况下为我的viewmodel选择视图?

在xaml中定义您的DataTemplates(可能在ResourceDictionary中,或在View的资源中,如(假设您已声明'vm',包含ViewModels的命名空间和'vw',包含您的Views的命名空间):< / p>

<DataTemplate DataType="{x:Type vm:LB_Data_All_ViewModel}">
  <vw:LB_Data_All_View />
</DataTemplate>

HTH:)

答案 1 :(得分:0)

谢谢,但我知道如何在XAML中设置它。我问如何在C#中编程选择它。

调用_backgroundWorker_RunWorkerCompleted时,我想用C#选择视图。我见过的所有解决方案都涉及到后面的代码中更改DataContext,但我希望将代码保留在代码之后(这是MVVM的重点)。

Josh Smith提到“在更复杂的场景中,可以以编程方式选择视图,但在大多数情况下这是不必要的......”但他从未提供过示例。他的演示应用非常简单。


没关系。不要大家一下子跳进来!我找到了另一个有这个链接的帖子:

http://wildermuth.com/2009/05/22/Which_came_first_the_View_or_the_Model

使用第三个类“结婚”视图和viewModel似乎是一个上升的共识。