2012-09-24 46 views
1

我對WPF或C#並不陌生,但我對MVVM和ViewModel情況並不陌生。如何用兩個UserControl中的一個使用局部變量填充MainWindow

我一直在經歷MVVM和綁定的基礎知識,我需要完成,但我仍然 與xaml細節絆倒。

我的最終目標是創建一個空白的MainWindow.xaml視圖,並使用兩個UserControl.xaml視圖中的一個視圖進行填充。

我有2個簡單的UserControl視圖:MainView.xaml和OptionalView.xaml。

<UserControl x:Class="TestViewSwap.MainView" 
     ...> 
<Grid> 
    <TextBlock Text="Main View" /> 
</Grid> 

<UserControl x:Class="TestViewSwap.OptionalView" 
     ...> 
<Grid> 
    <TextBlock Text="Optional View" /> 
</Grid> 

而一個MainWindow.xaml

<Window x:Class="TestViewSwap.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 

    <ContentControl Content="{Binding CurrentView}" /> 
</Window> 

我知道CurrentView需要在代碼中設置的背後要麼OptionalView或的MainView 取決於什麼我選擇,但我還不知道的是...什麼類型的CurrentView 0123需要或者需要在文件後面加什麼代碼?

+0

Sleff - 我試圖解決的確切同樣的問題,具有一定的領先地位。你可以在我的電子郵件地址上ping我 - 我們可以合作併發布並回復他人的利益 – Patrick

回答

1

CurrentView應該是您的MainWindowViewModel或Window.xaml上Datacontext的任何類的屬性。爲每個視圖定義一個數據模板。數據模板可以包含視圖或指向用戶控件。將CurrentView分配給視圖模型以切換視圖。下面是一些代碼:

MainWindowViewModel

public class MainWindowViewModel : ViewModel 
{ 
    object currentView; 

    public MainWindowViewModel() 
    { 
    CurrentView = new OptionalView(); 
    SwitchViewCommand = new RelayCommand(SwitchView); 
    } 

    public object CurrentView 
    { 
    get { return this.currentView; } 
    set 
    { 
     this.currentView = value; 
     NotifyPropertyChanged("CurrentView"); 
    } 
    } 

    public RelayCommand SwitchViewCommand { get; set; } 

    void SwitchView() 
    { 
    if (CurrentView is OptionalView) 
     CurrentView = new SettingsView(); 
    else 
     CurrentView = new OptionalView(); 
    } 
} 

public class OptionalView { } 

public partial class SettingsView { } 

主窗口

<Window x:Class="WpfLab.Views.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:views="clr-namespace:WpfLab.Views" 
    xmlns:vm="clr-namespace:WpfLab.ViewModels" 
    Title="MainWindow" 
    Width="525" 
    Height="350"> 
<Window.Resources> 
    <DataTemplate DataType="{x:Type vm:OptionalView}"> 
     <Border Background="Red" /> 
    </DataTemplate> 

    <DataTemplate DataType="{x:Type vm:SettingsView}"> 
     <views:SettingsView /> 
    </DataTemplate> 
</Window.Resources> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <ContentControl Content="{Binding CurrentView}" /> 
    <Button Grid.Row="1" 
      Command="{Binding SwitchViewCommand}" 
      Content="SwitchView" /> 
</Grid> 

設置查看

<UserControl x:Class="WpfLab.Views.SettingsView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     d:DesignHeight="300" 
     d:DesignWidth="300" 
     mc:Ignorable="d"> 
<Border Background="Green" /> 

+0

Per - 理解你的建議 - 將CurrentView作爲公共屬性顯然是必要的 - 但是,如何通過該方法綁定usercontrol屬性(意思是如果MainWindowViewModel中的屬性設置爲value = OptionalView) - 那麼如何在Mainwindow.xaml中翻譯該屬性並呈現可選視圖用戶控件。假設這裏的usercontrols沒有任何ViewModel,並且是簡單的usercontrols(只有簡單的XAML代碼) – Patrick

+0

我已經更新了我的答案。即使您在每個視圖之前不需要單獨的視圖模型,它也是渲染不同視圖的簡單方法。 – Per

+0

感謝Per,我在每個視圖的單獨視圖模型之間搖擺不定,所以我現在沒有偏好,也沒有從應用程序需求的角度來具體需要它。我會看看現在對我做了什麼。 – Sleff

相關問題