2013-10-27 67 views
1

我有一個很長的xaml。然後,我爲xaml的菜單部分創建了一個UserControl,使其變得乾淨(我認爲)。在我的主要xaml代碼隱藏中,我實例化了ViewModel類並將其設置爲主要xaml的DataContext。爲了讓主菜單和菜單xaml相互溝通,我選擇使用與菜單代碼隱藏的數據上下文相同的視圖模型。我實例化了另一個ViewModel類。我的代碼到目前爲止工作得很好。2 XAML使用相同的ViewModel類,但2個獨立的實例

但是我覺得我沒有這樣做。我相信我只需要ViewModel實例的一個實例。但是因爲main.xaml.cs和menu.xaml.cs不知道對方,所以我不知道如何共享這個實例。

+0

你能不能把你的視圖模型財產App.xaml.cs類? – Aybe

+0

我不知道如何。在main.xaml.cs的構造函數中,我有'myViewModel = new MyViewModel(); this.DataContext = myViewModel();'我爲menu.xaml.cs使用相同的行。 – Unplug

+0

很多[MVVM框架](http://stackoverflow.com/questions/5069783/which-mvvm-framework-is-the-best-framework-for-wpf-apps)有一個[IoC容器](http: //msdn.microsoft.com/en-us/magazine/jj991965.aspx),讓你解析ViewModel的同一個實例或者通過構造函數注入它。 –

回答

1

您可以將屬性添加到您的App.xaml.cs中,然後將其綁定到您的控件中。

1日的做法:爲XAML資源

你的模型:

public class MyViewModel 
{ 
    public int Hello { get; set; }  
} 

App.xaml.cs:

<Application x:Class="WpfApplication12.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:wpfApplication12="clr-namespace:WpfApplication12" 
      StartupUri="MainWindow.xaml"> 
    <Application.Resources> 
     <wpfApplication12:MyViewModel x:Key="MyViewModel" /> 
    </Application.Resources> 
</Application> 

小記:有沒有必要註釋對象x:Shared="True",因爲它是默認值,將返回相同的實例。 http://msdn.microsoft.com/en-us/library/aa970778.aspx

用戶控件:

<UserControl x:Class="WpfApplication12.UserControl2" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid DataContext="{Binding Mode=OneWay, Source={StaticResource MyViewModel}}"> 
     <TextBlock Text="{Binding Path=Hello}" /> 
    </Grid> 
</UserControl> 

現在,因爲你的模式是一種資源,你可以通過創建一個屬性檢索:

public MyViewModel MyViewModel 
{ 
    get { return Application.Current.FindResource("MyViewModel") as MyViewModel; } 
} 

(你可能要存儲在該引用字段,但是。)

第二個辦法:如果由於某種原因,你更喜歡傳統的財產作爲一個傳統的財產

,這裏的語法:

注意,屬性是靜態的,靜態構造函數初始化。

public partial class App : Application 
{ 
    static App() 
    { 
     MyViewModel = new MyViewModel(); 
    } 

    public static MyViewModel MyViewModel { get; set; } 
} 

綁定到它在你的用戶控件:

<Grid DataContext="{Binding Source={x:Static wpfApplication12:App.MyViewModel}}"/> 
+0

你的答案是有道理的。我試過了,但是在''行出現錯誤。錯誤消息是_Cannot不能創建「MyViewModel」_的實例。我假設這行可以放在任何類型的子控件中,因爲我的main.xaml是一個UserControl。我把它放在''中。 – Unplug

+0

我通過從MyViewModel的構造函數中刪除兩行來解決此問題。 '_MyDoc = new XmlDocument(); _MyDoc.Load(_PathToReport);'我不知道爲什麼這兩行會導致問題。 – Unplug

+0

這是另一個問題。在該行中:',我得到了_ MyViewModel資源無法解析錯誤。 – Unplug

0

你可以有它包裝另一種觀點認爲兩者的MenuViewMainView,並設置在包裝鑑於DataContext,那麼這兩個你MenuViewMainView將繼承和使用相同的DataContext

用於包裝查看樣品XAML:

<UserControl x:Class="WpfApplication1.YourView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:wpfApplication1="clr-namespace:WpfApplication1" 
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <wpfApplication1:YourMenuView Grid.Row="0"/> 
     <wpfApplication1:YourMainView Grid.Row="1"/> 
    </Grid> 
</UserControl> 

和代碼隱藏的WrapperView:

public partial class YourView : UserControl 
{ 
    public YourView() 
    { 
     InitializeComponent(); 
     DataContext = new YourViewModel(); 
    } 
} 
0

你可以把雙方的用戶控件進入MainWindow.Xaml,並設置數據上下文MainWindow.xaml.cs或暴露靜態屬性在你的viewmodel中的viewmodeltype是這樣的:

public class ViewModel 
{ 
    private static ViewModel instance = new ViewModel(); 

    public static Viewmodel Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 

在xaml.cs,你可以做到以下幾點:

DataContext = ViewModel.Instance; 

可以重複此行以任何數量的xaml.cs的,對於所有的XAML現在你只有一個實例。

+0

其實它是XAML,而不是XMAL! :-) – Aybe

+0

編輯帖子然後@Aybe ;-) –

相關問題