2016-05-16 70 views
0

我有一個MVVM的WPF應用程序。我正在嘗試構建我自己的關閉按鈕。基於這個答案Creating a custom Close Button in WPF我在查看(xaml.cs)代碼中添加了一個按鈕事件處理程序。但是,它不承認Close();呼叫(在上下文中不存在 - 無法解析符號)。如何構建我自己的關閉按鈕?

另外我嘗試了其他答案,並將CommandCommandParameter添加到我的按鈕的xaml中。但背後的功能並沒有得到命中。在How to bind Close command to a button使用RelayCommand也我wpf不承認RelayCommand。然後How can I use the RelayCommand in wpf說我必須自己寫(真的?)。我記得有一種類似於的簡單方法設置按鈕的事件處理程序,並調用Close();。但是,我該怎麼做,或者爲什麼它不適合我?

查看代碼:

private void closeButton_Click(object sender, RoutedEventArgs e) 
{ 
    // I want to call close the whole app on button click 
    //Close(); is not recognized 
} 

private void performMainCloseButtonCommand(object Parameter) 
{ 
    // This doesn't get hits on button click 
    Window objWindow = Parameter as Window; 
    objWindow.Close(); 
} 

按鈕XAML:因爲可能沒有在當前類關閉調用的方法

 <Button x:Name="closeButton" RenderTransformOrigin="0.5,0.5" Padding="0" Margin="701,0,0,0" BorderThickness="0" Click="closeButton_Click" Command="{Binding MainCloseButtonCommand}" CommandParameter="{Binding ElementName = mainWindow}" Height="45" Width="45" > 
      <StackPanel Height="45" Width="45"> 
       <Image x:Name="closeButtonImage" Margin="0" Source="/ProjectName;component/Resources/x.fw.png" Height="33"/> 
       <TextBlock Text="Close" Width="36" Padding="6,0,0,0" HorizontalAlignment="Center" Height="13" FontSize="10"/> 
      </StackPanel> 
     </Button> 
+1

如果你只是在視圖和代碼背後工作,你可能沒有準確地跟隨MVVM模式。大多數情況下,使用'RelayCommands'來代替點擊事件。 – Jonesopolis

回答

2

關閉未在事件處理程序的認可。如果你想調用主窗口的關閉方法,你可以使用:

private void closeButton_Click(object sender, RoutedEventArgs e) 
{ 
Application.Current.MainWindow.Close();  
} 

上面沒有做到這一點的好辦法,不與MVVM模式一致。這與你的第二個問題有關。沒有看到代碼的剩餘部分,很難說爲什麼命令綁定不起作用。我的猜測是你沒有正確連接這些命令來觸發它。您需要確保已經創建了您的RelayCommand實例,並且您的命令屬性已正確設置。

+0

我不同意有關與MVVM對齊的部分。我的觀點是,如果邏輯只與查看有關,那麼就可以將它包含在代碼隱藏中。因此,假設在啓動關閉操作時不需要保存邏輯或返回邏輯(業務邏輯),則通過將關閉邏輯置於代碼隱藏中,仍然遵循分離關注點。 –