2012-04-05 9 views
2

ここで私が間違っているのは分かりません。うまくいけばあなたの一人が助けることができます。チェック可能なMenuItemを親ウィンドウにバインドする際に問題があります。最上部(常に上に表示される)プロパティ

私はTabControlを含むウィンドウを持っています。 TabControlには、 "always-on-top"動作のためのチェック可能な項目を持つContextMenuがあります。私は、このチェック可能な項目を、ウィンドウのブールTopmostプロパティを含むウィンドウにバインドします。

私が何をしても、バインディングは失敗し、デバッグ出力に「バインド元が見つかりません」というエラーが表示されます。

(。これらの抜粋が大幅に私の実際のコードから簡略化されている私は、私が誤って、関連するものを切り取っていなかった願っています。)

まず、私はこれを試してみました: didnの

<Window x:Name="myWindow" (blah blah other properties)> 
    <TabControl x:Name="tabControl"> 
     <TabControl.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Always on Top" IsCheckable="True" 
          IsChecked="{Binding ElementName=myWindow, 
               Path=Topmost, 
               Mode=TwoWay}"/> 
      </ContextMenu> 
     ... 

仕事はありません。 MenuItemがウィンドウ "myWindow"の内部にあるからですか? RelativeSource Ancestorバインディングを使用する必要がありますか?

は、だから私はこれを試してみました:

<Window x:Name="myWindow" (blah blah other properties)> 
    <TabControl x:Name="tabControl"> 
     <TabControl.ContextMenu> 
      <ContextMenu> 
       <MenuItem Header="Always on Top" IsCheckable="True" 
          IsChecked="{Binding RelativeSource={ 
                RelativeSource FindAncestor, 
                AncestorType={x:Type Window} 
               }, 
               Path=Topmost, 
               Mode=TwoWay}"/> 
      </ContextMenu> 
     ... 

のいずれかに動作しなかったこと。

だから私は立ち往生しています。この拘束力のある仕事をどうやって作るのですか?

注:私のコードビハインドはこれらの要素で何もしていません。 Window.DataContextなどを設定する必要はありますか?これはおそらくこのウィンドウの他の部分を壊す可能性があります。

答えて

2

はい、 "TopMost"プロパティがオンになっているオブジェクトは、ウィンドウのDataContextとして設定する必要があります。あなたのウィンドウのDataContextとして設定されている場合、コントロールは、あなたの最初の例で試したElementNameバインディングからプロパティを取得することができるはずです。

あなたのビューがelementNameが動作しない理由FindAncestorは動作しますが、いないいない可能性があります理由を説明するだろう

+0

DataContextとElementNameの関係は何ですか?彼らはどちらも同じことをしているように見えますか? –

+0

DataContextは、ビューのバッキングプロパティを表すオブジェクトです。任意の単純なバインディング式は、バインドされたプロパティのDataContextを調べます。 ElementNameバインディングは、要素の属性を別の要素の属性にバインドすることを意味します(たとえば、テキストボックスのテキスト属性をボタンのコンテンツ属性にバインドするなど)。 – KodeKreachor

+0

私はまだフォローしません。私は** "**要素の属性を別の要素の属性にバインドしています"(つまり、私はMenuItem.IsCheckedをmyWindow.Topmostにバインドしています)。 DataContextの目的は何ですか?なぜ私はそれを与えた明示的なElementName以外の場所を探していますか? –

0

私が覚えている限り、メニューは実際にはウィンドウのビジュアルツリーの一部ではないポップアップで描かれています。したがって、ここでMVVMを使用し、ビューモデルを通じてIsCheckedを設定することをお勧めします。

+0

「のTopMost」という名前のプロパティのためにそのDataContextを見ていきます。 –

関連する問題