2017-05-05 12 views
-1

他のケースを読んだことがあります。このメッセージについてのStackOverflowはありますが、私の問題に変更を適用する方法がわかりません。私はWPFで作られた小さなアプリケーションを持っていて、xamlの私の無知はその犠牲を払っています。私はコンパイルし、すべては問題ありませんが、VS2015の出力ウィンドウでデバッグモードで実行しているときに表示されます System.Windows.Data Error:4: 'ElementName = lbEnfermedades'という参照でバインディングのソースを見つけることができません。 BindingExpression:(パスなし); DataItem = null;ターゲット要素は 'MenuItem'(Name = '')です。ターゲットプロパティが 'CommandTarget'(タイプ 'IInputElement') 私はコンテキストメニューに問題があるだけではないことがわかります。示唆したように私はRoutedUICommandを使用してクラスを作成しました:コンテキストメニューを使用しているときに参照付きのバインディングのソースが見つかりません

namespace Maqueta 
{ 
    class CommandLibrary 
    { 
     private static RoutedUICommand relacionados = new RoutedUICommand("Relacionados", "BuscarRelacionados", typeof(CommandLibrary)); 

     public static RoutedUICommand BuscarRelacionados 
     { 
      get { return relacionados; } 
     } 

    } 
} 

私は多分、私がやっているコントロールのネスティングが禁止され、XAMLのこの部分を持っていますか? TabControlので、私は、リストボックスを配置し、コンテキストメニューの添付:これらのメソッドは決してありません

private void OnBuscarRelacionadosExecute(object sender, ExecutedRoutedEventArgs e) 
{ 
    ListBox lb = sender as ListBox; 
    if (lb != null) 
    { 
     if (lb.SelectedItem != null) 
     { 
      //lb.Items.Remove(lv.SelectedItem); 
      MessageBox.Show(lb.SelectedItem.ToString()); 
      e.Handled = true; 
     } 
    } 
} 

private void CanBuscarRelacionadosExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    ListBox lb = sender as ListBox; 
    if (lb != null) 
    { 
     e.CanExecute = true;//lb.SelectedItem != null; 
     e.Handled = true; 
    } 
} 

:私もここでは例として、別のポストを使用して、呼び出されるべきルーチンを作成し

<TabControl x:Name="tabControl" Grid.Column="1" HorizontalAlignment="Left" Height="287" Margin="10,243,0,0" VerticalAlignment="Top" Width="709" TabStripPlacement="Top" Grid.ColumnSpan="3"> 
    <TabItem Header="Enfermedades"> 
     <ListBox x:Name="lbEnfermedades" Grid.Column="1" Grid.ColumnSpan="3"> 
      <ListBox.ContextMenu> 
       <ContextMenu IsEnabled="True" IsManipulationEnabled="True"> 
        <MenuItem Command="local:CommandLibrary.BuscarRelacionados" 
           CommandTarget="{Binding ElementName=lbEnfermedades}" 
           Header="BuscarRelacionados" IsEnabled="True"/> 
       </ContextMenu> 
      </ListBox.ContextMenu> 
      <ListBox.CommandBindings> 
       <CommandBinding Command="local:CommandLibrary.BuscarRelacionados" CanExecute="CanBuscarRelacionadosExecute" Executed="OnBuscarRelacionadosExecute" /> 
      </ListBox.CommandBindings> 
      <CheckBox/> 
     </ListBox> 
    </TabItem> 
    <TabItem Header="Medicamentos"> 
     <ListBox x:Name="lbMedicamentos" Grid.Column="1" Grid.ColumnSpan="3"/> 
    </TabItem> 
    <TabItem Header="Procedimientos"> 
     <ListBox x:Name="lbProcedimientos" Grid.Column="1" Grid.ColumnSpan="3"/> 
    </TabItem> 
</TabControl> 

をリストボックスを右クリックするとコンテキストメニューがグレー表示(無効)になります。これは、「バインディングのソースを見つけることができません」というメッセージが原因であると私は理解しています。私が他の投稿(例えば、 "相対的なバインディングを使用する")で見られるヒントは、私の謎であるため、xamlバインディングの説明を指摘してください。マイクロソフトのサイトでも、決定的な文書を見つけることができませんでした。コンテキストメニュを使用する方がより直感的な作業だったらと思います。ありがとう。

クラウディオ。

答えて

1

コンテキストメニューのCommandTarget属性は余分です。表示されているエラーメッセージは、単にコマンドターゲットが無視されることを意味しています。だからコマンドのターゲットを取り出してください。リストボックスに対して定義したコマンドバインディングがコマンドターゲットになります。

それにもかかわらず、あなたのコンテキストメニューは私のためにCommandTarget属性の有無にかかわらず機能します...あなたが私たちと共有していないコードの部分に何か間違っています。

XAML、ルーティングされたコマンドのインプリメンテーションとコマンドバインディングはすべて上手く見えます。だから、あなたは問題のために間違った場所を探しているようです...あなたの拘束力が働いていないときに起こる共通の症状です。

残念ながら、あなたが習得する必要があるすべてのものがさまざまなソースに散在しているため、残念ながら[WPF]バインディングの完全な説明には言及できません。 1つの場所に存在する拘束力についての唯一の説明は、目に見える形で実行されています...あなたはそれをはるかに超えています。

私の経験では、バインディングの複雑さを調べる唯一の方法は、実験できる一連のテストコードを維持することです。がんばろう。

1

答えに時間がかかった人に感謝します。私はこのサイトでアイデアを探し続けましたが、何も役立たないようでした。

<MenuItem Command="local:CommandLibrary.BuscarRelacionados" 
     CommandTarget="{Binding ElementName=local:lbEnfermedades}" 
     Header="BuscarRelacionados" IsEnabled="True"/> 

私は のElementName =ローカルにのElementName = lbEnfermedadesを変更:lbEnfermedades最後に、今日の私は少しの部分を追加しました。なぜそれが必要なのか分かりません。それはまさに野生の愚痴でした。私が定義したイベントハンドラは期待どおりに動作しており、コンテキストメニューが表示されても私のメニュー項目は無効になりません。他の誰かが役に立つと思うかもしれません。

関連する問題