2016-10-26 10 views
0

4つの四角形を含むグリッドを持つWPFウィンドウがあります。そのうちの1つに、アプリケーションで使用されているページを表示するための<frame>があります。私はこれらのボタンにコマンドを追加したいと思う。フレームでウィンドウ内のコマンドを起動できません

私が使用していること:MVVM、ウィンドウとしてMainwindow、ページをコンテンツパブリッシャーとしてフレームに入れました。

たとえば、ボタンとコマンドでapplicationwideにログインしたいとします。私のフレームのページでこれを行っている間、エラーはありませんが、私はウィンドウ内で同じことをすることはできません。

フレーム内のページに移動中にウィンドウがフォーカスを失っても、そのイベントを起動できないのではないかと疑問に思っていました。

私の
public ICommand CommandWhichDoesNotFire; 
    public MainViewModel() 
    { 
     MessageBox.Show("VM is real"); 

     CommandWhichDoesNotFire= new TestCommand(); 
    } 

DataContext:私のViewModel「MainViewModel」私は公共ICommandプロパティを持っていると私は、コンストラクタでそれを初期化するには

<Button Content="&#xE143;" FontFamily="Segoe UI Symbol" 
    Command="{Binding CommandWhichDoesNotFire, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type vw:MainViewModel}}}" 
    Width="32"> 

:だから私は、次のコマンドを結合して、ウィンドウを取得しようとしましたMainViewが裏コードに設定されているBEFORE InitilizeComponents(); ボタンをクリックしても、自分のコマンドの呼び出しが開始されません。それは単に全く発射しません。私は何を失っているのですか?

+0

最小限のウィンドウとDataContextの設定方法により、さらにコードを投稿できますか?それなしであなたを助けるのは難しいです。 – XAMlMAX

+0

あなたのVSコンソール出力にバインディングエラーが報告されていますか? Snoopを起動してバインドが成功したかどうか確認できますか? – LordWilmore

答えて

0

あなたは持っている必要があります。

public ICommand CommandWhichDoesNotFire{get;set;} 
public MainViewModel() 
{ 
    MessageBox.Show("VM is real"); 

    CommandWhichDoesNotFire= new TestCommand(MyCommand); 
} 
private void MyCommand(object obj){ 
//Whatever you want to do 
} 
0

私は私はあなたの問題への解決策を見つけたと思います。それのDataContextを継承していない何らかの理由でFrame
は、あなたがそうのように明示的にDataContextを設定していても、親だ:それはまだ動作しません

DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" 

。ここ Frame's Data Context is set
と子要素のDataContextです:私たちは常にWPFについて愛しているし、それは何でもすることを、これは私が考えて作られた今
Child element Data Context is NULL!
それはフレームのみのDataContextではなく、子要素を設定し、何コントロールはContextMenuを除き、Frameを除き、親からDataContextを継承する機能でした。ここで私はoyur問題で延期見ていたとき、私が取ったアプローチされています

<Window x:Class="WpfApplication1.MainWindow" 
    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" 
    xmlns:local="clr-namespace:WpfApplication1" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.DataContext> 
    <local:MainVM/> 
</Window.DataContext> 
<Window.Resources> 
    <!--<local:MainVM x:Key="mainVM"/>--> 
    <local:LoginPage x:Key="login" /> 
    <!--DataContext="{StaticResource mainVM}"--> 
    <ControlTemplate x:Key="ctrlTmpl"> 
     <local:LoginPage/> 
    </ControlTemplate> 

</Window.Resources> 
<Grid> 
    <!--<Button x:Name="button" Content="Do something" Click="btnDoSomething" HorizontalAlignment="Left" Margin="221,60,0,0" VerticalAlignment="Top" Width="75"/>--> 
    <!--<Control Template="{StaticResource ctrlTmpl}"/> This works--> 
    <Frame Content="{StaticResource login}" DataContext="{Binding DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" /> 
</Grid> 


は、その後、私はあなたがこれに別の方法を行うことができます考えた:私はVMが含まれてどのように

<Window x:Class="WpfApplication1.MainWindow" 
    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" 
    xmlns:local="clr-namespace:WpfApplication1" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525"> 
<!--<Window.DataContext> 
    <local:MainVM/> 
</Window.DataContext>--> 
<Window.Resources> 
    <local:MainVM x:Key="mainVM"/> 
    <local:LoginPage x:Key="login" DataContext="{StaticResource mainVM}"/> 
    <!----> 
    <ControlTemplate x:Key="ctrlTmpl"> 
     <local:LoginPage/> 
    </ControlTemplate> 

</Window.Resources> 
<Grid> 
    <!--<Button x:Name="button" Content="Do something" Click="btnDoSomething" HorizontalAlignment="Left" Margin="221,60,0,0" VerticalAlignment="Top" Width="75"/>--> 
    <!--<Control Template="{StaticResource ctrlTmpl}"/> This works--> 
    <Frame Content="{StaticResource login}"/> 
</Grid> 


お知らせそのインスタンスをコントロールDataContextに使用しました。この時点で、LoginPage.xaml内のボタンをクリックすると、それはUserControlで、私のMainVMにあるコマンドがトリガーされます。この時点で、あなたはそうのようなコードの後ろにWindowDataContextを割り当てる必要があります:

public MainWindow() 
    { 
     InitializeComponent(); 

     var vm = this.TryFindResource("mainVM"); 
     if(vm != null) 
     { 
      this.DataContext = vm; 
     } 
    } 

は今、この時点で、あなたは、ページを移動してPage秒またはUserControlの異なるを使用するトリガのいくつかの並べ替えを使用することができます。HTH
P.S.私がチャンスを得ると、MSDNからContext MenuとFrameに関するいくつかの情報を更新します。ハッピーコーディング

関連する問題