2013-05-01 13 views
0

我一直在使用MVVM模型一週左右,現在我想我應該處理什麼應該去哪裏。注意那裏的「思考」。控制數據綁定在MVVM場景中查看而不是ViewModel

我有我的觀點(主窗口)結合

_ViewModel = new MainViewModel(); 
this.DataContext = _ViewModel; 

我有幾個個ICommand那些視圖模型中工作,隨後的模型,該模型我很好用單視圖模型。

現在,我開始從我的視圖(主窗口),我在代碼隱藏做了幾個窗口,因爲這一切都純粹是查看相關的東西。我試圖複製View中的ViewModel中的ICommand設置來簡化我的生活,所以我想。我有以下命令設置:

public ICommand comInitialiseWindows { get; private set; } 

private bool _windowsactive = false; 
public bool WindowsActive 
{ 
    get { return _windowsactive; } 
    set { SetProperty(ref _windowsactive, value); } 
} 
public bool comInitialiseWindows_CAN() 
{ 
    return !_windowsactive; 
} 
private void comInitialiseWindows_DO() 
{ 
    ... Code to do the window creation, etc. 
} 

我在主窗口代碼此繼電器命令:

comInitialiseWindows = new RelayCommand(() => comInitialiseWindows_DO(), comInitialiseWindows_CAN); 

如果我把這個視圖模型它的工作原理治療除了窗口創建的東西,但因爲它的視圖相關我並不感到驚訝。

所以問題是當我點擊按鈕時代碼不運行。我猜XAML綁定到ViewModel,但我無法找到解決這個問題的方法,無需在代碼隱藏中將每個按鈕的綁定設置爲MainWindow。我曾以爲,以下會的工作,但它並不:

<Button x:Name="ribbutLayoutWindows"          
    Command="{Binding local:comInitialiseWindows}" 
    IsEnabled="{Binding local:comInitialiseWindows_CAN}"/> 

我敢肯定,我只是沒有得到的東西的地方。或者我試圖在正常按鈕點擊已經足夠的情況下進行過分複雜的處理,因爲它只是查看。

有什麼建議嗎?

+0

爲什麼「啓動幾個窗口」純看法有關係嗎?您的視圖模型包含視圖邏輯,視圖只是爲用戶可視化視圖模型。我使用從視圖模型調用的服務來啓動新的對話框或窗口。順便說一句,你應該檢查你是否需要新窗口,或者只是爲了切換主視圖的用戶控件。 – blindmeis 2013-05-02 05:04:30

回答

1

有兩種可能性:

通過視圖模型: 你可以在你的ViewModel揭露房產:

class MainViewModel 
{ 
    ICommand comInitialiseWindows {get; set;} 
} 

而在你的主窗口:

MainViewModel vm = this.DataContext as MainViewModel; 
vm.comInitialiseWindows = new RelayCommand(() => comInitialiseWindows_DO(), comInitialiseWindows_CAN); 

XAML:

<Button x:Name="ribbutLayoutWindows" Command="{Binding comInitialiseWindows}" /> 

注意:您不需要綁定IsEnabled屬性。 WPF會爲你處理,並自動調用你的ICommand的CanExecute方法。

通過一個DependencyProperty

在您的代碼隱藏聲明本dependecyProperty:

public ICommand comInitialiseWindows 
{ 
    get { return (ICommand)GetValue(MyPropertyProperty); } 
    set { SetValue(MyPropertyProperty, value); } 
} 

public static readonly DependencyProperty comInitialiseWindowsProperty = 
    DependencyProperty.Register("comInitialiseWindows", typeof(ICommand), typeof(MainWindow), new PropertyMetadata(null)); 

指定的代碼隱藏值:

comInitialiseWindows = new RelayCommand(() => comInitialiseWindows_DO(), comInitialiseWindows_CAN); 

後,您需要打破XAML中的數據上下文。首先,給你的第一個名字:

<Window x:Class="Web_Media_Seeker_WPF.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:local="clr-namespace:Web_Media_Seeker_WPF" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="myWindow" 
     Title="MainWindow" Height="350" Width="525"> 

然後聲明你的綁定,如下所示:

<Button x:Name="ribbutLayoutWindows" Command="{Binding comInitialiseWindows, ElementName=myWindow}" /> 
+0

感謝您的回覆。除非我在第一個例子中弄錯了,否則「_DO」將出現在ViewModel中。我已經試過了,並且它能夠正常工作,只是窗口處理我需要在MainWindow代碼隱藏中。我已經看過第二個例子,但它似乎並不適合我。我猜你把「MyPropertyProperty」放在哪裏,應該是comInitialiseWindowsProperty,但是「_DO」代碼不會觸發。 – MikeyTT 2013-05-02 17:36:46

+0

不,在第一個例子中,虛擬機中唯一的東西就是屬性。該命令的方法和創建在MainPage中。 – Kenneth 2013-05-02 17:40:32

+0

啊。我會試試看。在第二個例子中,我在輸出窗口中得到了「無法找到綁定的源代碼」的消息,所以在某處顯然有些不妥。 – MikeyTT 2013-05-02 17:49:28