2016-05-16 21 views
0

私はMVVMを備えたwpfアプリケーションを持っています。私は自分のクローズボタンを作成しようとしています。この回答Creating a custom Close Button in WPFに基づいて、(xaml.cs)コードのボタンイベントハンドラを追加しました。ただし、Close();コールは認識されません(コンテキストには存在しません。シンボルを解決できません)。自分の閉じるボタンを作成するには?

また、他の回答を試みて、CommandCommandParameterをボタンのxamlに追加しました。しかし、後ろの機能はヒットしていません。 RelayCommandを使用してHow to bind Close command to a buttonで私の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パターンを正確にフォローしていない可能性があります。 Clickイベントの代わりに 'RelayCommands'が使われます。 – Jonesopolis

答えて

2

閉じるには、あなたのイベントハンドラで認識されません。あなたは、メインウィンドウのcloseメソッドを呼び出したい場合は、使用することができます。

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

以上がこれを行うには良い方法ではありませんし、MVVMパターンと一致していません。あなたの2番目の質問に関連しています。あなたのコードの残りの部分を見ることなく、なぜコマンドバインディングが機能していないのかを言うのは難しいです。私の推測では、あなたがコマンドを発射するために適切に配線していないと思います。 RelayCommandインスタンスを作成し、コマンドプロパティが正しく設定されていることを確認する必要があります。

+0

私は、MVVMとのアライメントに関する部分については同意しません。私の意見は、ロジックが表示に関係するだけの場合は、コードビハインドに含まれていることです。したがって、クローズ・オペレーションの開始時にセーブ・ロジックまたはリターン・ロジック(ビジネス・ロジック)が必要ないと仮定すると、コードビハインドにクローズ・ロジックを置くことによって、懸念の分離には依然として従います。 –