2017-06-30 3 views
0

So habe ich eine Listenansicht, die Postelemente anzeigt (Lieferdatum, Typ, Verfolgungsnummer usw.) und ich habe ein Kontextmenü eingerichtet, das entweder die Tracking-Website öffnet oder die Tracking-Nummer kopiert die Zwischenablage.ContextMenu basierend auf Objektbindung wpf

Was ich will ist, dass das Kontextmenü nur für Listen erscheint, die eine Tracking-Nummer haben. Ich habe die Idee, die Sichtbarkeit des Kontextmenüs zu ändern, aber es ist die Bindung an die Tracking-Nummer, mit der ich Probleme habe.

<ContextMenu x:Key="MyElementMenu"> 
    <MenuItem Header="Track Item" Click="MenuItem_Click"></MenuItem> 
    <MenuItem Header="Copy to Clipboard" Click="MenuItem_CopyToClipboard"></MenuItem> 
</ContextMenu> 


<!--Sets a context menu for each ListBoxItem in the current ListBox--> 
<Style TargetType="{x:Type ListViewItem}"> 
    <Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/> 
</Style> 

Dies ist, was ich derzeit habe.

+0

Haben Sie versucht, einen Konverter zu verwenden? –

+0

Ich denke, ContextMenu würde erscheinen, wenn Sie mit der rechten Maustaste auf das ListViewItem klicken. Warum also nicht das Rechtklick-Ereignis verwenden und sehen, ob das angeklickte Element die Verfolgungsnummer-Eigenschaft hat und dann das Kontextmenü ein- oder ausblenden. – Ahmar

+0

Dies könnte https://stackoverflow.com/questions/21939667/nulltovisibilityconverter-make-visible-if-not-null helfen – hoodaticus

Antwort

0
<MyControl.Resources>  
    <BooleanToVisibilityConverter x:Key="BoolToVis"/> 
</MyControl.Resources> 

<!--Sets a context menu for each ListBoxItem in the current ListBox--> 
<Style TargetType="{x:Type ListViewItem}"> 
    <Setter Property="ContextMenu"> 
    <Setter.Value> 
     <ContextMenu IsEnabled="{Binding HasTrackingNumber}" Visibility="{Binding HasTrackingNumber, Converter={StaticResource BoolToVis}"> 
     <MenuItem Header="Track Item" Click="MenuItem_Click"></MenuItem> 
     <MenuItem Header="Copy to Clipboard" Click="MenuItem_CopyToClipboard"></MenuItem> 
     </ContextMenu> 
    </Setter.Value> 
    </Setter> 
</Style> 

Dies sollte Sie geben, was Sie brauchen. Nicht sicher, ob Sie das ContextMenu woanders verwenden, aber wenn Sie es nicht tun, können Sie es immer im Stil des ListViewItem Style festlegen. Dann brauchen Sie es nicht von woanders referenziert zu haben. So oder so, es ist mehr über das Hinzufügen der Bindung aus dem Element. In Ihrem ListItem Ansichtsmodell könnte man so etwas hinzufügen:

public bool HasTrackingNumber => TrackingNumber == 0 || TrackingNumber == null;

(ich weiß nicht, was Ihre Tracking-Nummer geben ist, so können Sie Ihre eigene Logik prüft tun zu wissen, ob es „hat“ eine gültige Tracking-Nummer)

0

, die für einen Auslöser wie ein Fall scheint:

<Style TargetType="{x:Type ListViewItem}"> 
    <Setter Property="ContextMenu" Value="{StaticResource MyElementMenu}"/> 
    <Style.Triggers> 
     <!-- 
     Maybe the tracking number property is called something else, maybe it's 0 
     instead of null when absent. You didn't say. 
     --> 
     <DataTrigger Binding="{Binding TrackingNumber}" Value="{x:Null}"> 
      <Setter Property="ContextMenu" Value="{x:Null}"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style>