2009-10-06 42 views
0

如何在不使用代碼的情況下爲我的viewmodel選擇一個視圖?我想從一個WCF調用中加載大量數據的ListBox。使用Josh Smith的應用程序,視圖在數據到達之前加載,爲空。我想要接收所有數據,然後選擇顯示進度的微調視圖。MVVM - 如何以編程方式爲我的viewmodel選擇一個視圖?

// 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; 
} 

回答

3

- 如何在不使用代碼的情況下爲我的viewmodel選擇視圖? (假設你已經聲明'vm',包含你的ViewModel和'vw'的命名空間,包含你的Views的命名空間):xaml中定義你的DataTemplates(可能在ResourceDictionary或視圖的資源中)

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

HTH :)

0

謝謝你,但我知道如何設置的XAML。我在問如何在C#中使用PROGRAMMATICALL進行選擇。

當_backgroundWorker_RunWorkerCompleted叫,我想選擇用C#的看法。我所見過的所有解決方案都涉及在後臺代碼中更改DataContext,但我希望代碼不在代碼後面(這是MVVM的要點)。 Josh Smith提到:「在更復雜的情況下,可以以編程方式選擇視圖,但在大多數情況下這是不必要的......」但他從來沒有提到過一個例子。他的演示應用程序非常簡單。


沒關係。不是每個人都馬上跳進去!我發現在另一個帖子裏有這個鏈接:

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

使用第三類爲「結婚」的觀點和視圖模型似乎上升共識。

+0

但是你問:「如何在不使用代碼的情況下爲我的viewmodel選擇一個視圖?」,這意味着在XAML中。 – 2009-10-06 15:53:20

+0

「以編程方式」推斷使用C#而非XAML,例如Josh Smith的引述:「在更復雜的情況下,可以以編程方式選擇視圖...」,我在上面發佈。不使用後面的代碼是View和ViewModel的分離,這對MVVM很有意義,將表示與邏輯分開。 – Gabriel 2009-10-07 18:33:31

相關問題