none
Menuitem mittels Databinding ausschalten RRS feed

  • Allgemeine Diskussion

  • Hallo Leute,

    ich brauch mal wieder einen guten Tipp. Ich habe in meiner Windows.xaml.cs Klasse eine Variable definiert die gewisse Programmeinstellungen enthält, unter anderem ob gewisse Contextmenu Einträge angezeigt werden sollen oder nicht. Irgendwie komm ich da aber auf keinen grünen Zweig, habs mal folgenderweise probiert:

    public partial class MainWindow : Window
      {
            private CProgramSettings _programSettings = (CProgramSettings)Application.Current.Resources["Settings"];
    
    <Window x:Class="DesktopCleanUp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:DesktopCleanUp"
        xmlns:prop="clr-namespace:DesktopCleanUp.Properties"
        Title="{x:Static prop:Resources.AppName}" Height="379" Width="525" Loaded="OnLoaded" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
      <Window.Resources>
          <Style x:Key="LockStyle" TargetType="MenuItem">
          <Style.Triggers>
            <DataTrigger Binding="{Binding Path=_programSettings.DisableLock}" Value="False">
              <Setter Property="IsEnabled" Value="False"></Setter>
            </DataTrigger>
          </Style.Triggers>
        </Style>
        <ContextMenu Name="cmMenu" x:Key="ItemContextMenu" HasDropShadow="True" DataContext="{Binding}">
          <MenuItem Header="{x:Static prop:Resources.mnuContextMove}" Click="OnContextMenuMOVE" DataContext="{Binding}">
            <MenuItem.Icon>
              <Image Source="/DesktopCleanUp;component/Icons/move.ico"></Image>
            </MenuItem.Icon>
          </MenuItem>
          <MenuItem Header="{x:Static prop:Resources.mnuContextLock}" Style="{StaticResource LockStyle}" Click="OnContextMenuLOCK">
            <MenuItem.Icon>
              <Image Source="/DesktopCleanUp;component/Icons/lock16x16.ico"></Image>
            </MenuItem.Icon>
          </MenuItem>
          <MenuItem Header="{x:Static prop:Resources.mnuContextDelete}" Click="OnContextMenuDELETE">
            <MenuItem.Icon>
              <Image Source="/DesktopCleanUp;component/Icons/delete16x16.ico"></Image>
            </MenuItem.Icon>
          </MenuItem>
        </ContextMenu>
    
    

    Ich habe also die Variable _programSettings und möchte diese nun dazu verweden um mit dem StyleTrigger das MenuItem auszuschalten (IsEnabled = false).

    Wie mache ich das richtig, ist der Weg falsch oder mache ich nur das Databinding verkehrt?

    lg. Johannes 

    Montag, 2. Mai 2011 13:48

Alle Antworten

  • Binde im Xaml die Eigenschaft "IsEnabled" des MenuItems an eine neue Eigenschaft  "IsLockEnabled" in deinem CodeBehind.
    Dabei musst du beachten, dass du im Codebehind Constructor den DataContext setzt.
    Dann kannst du im Code über die Eigenschaft "IsLockEnabled = false;" die Bearbeitbarkeit des MenuItem steuern.

    Hier ein Beispiel:

    XAML:

    <MenuItem Header="{x:Static prop:Resources.mnuContextLock}" Style="{StaticResource LockStyle}" 
    
    IsEnabled="{Binding IsLockEnabled, Mode=TwoWay}">
    
    ...

    Codebehind:

    ...
    
    public MainWindow() => Evtl. muss du noch INotifyPropertyChanged implementieren
    
    {
    
     this.DataContext = this;
    
    }
    
    
    
    ...
    
    
    
    public bool IsLockEnabled
    
    {
    
     get
    
     {
    
     return _isEnabled;
    
     }
    
     set
    
     {
    
      isEnabled = value;
    
      this.OnPropertyChanged("IsLockEnabled");
    
     }
    
    }

    Montag, 2. Mai 2011 15:15
    Beantworter
  • Hallo Marco,

    danke für die Idee, hab das mal probiert umzusetzen, nur irgendwie wird die Property IsLockEnabled nie aufgerufen :-/

    Wie ist denn das mit dem DataContext? Ich verwende ja die unterschiedlichsten Datenquellen, siehe Beispiel oben.

    Kanns sein das ich zwar den DataContext in MainWindow() richtig setze er aber dann an anderer Stelle im XAML wieder überschrieben wird?

    Zumindest sehe ich im Visual Studio bei der Eigenschaft IsEnabled das er den Pfad IsLockEnabled nicht auflösen kann.

     

    lg. Johannes


    Dienstag, 3. Mai 2011 06:37
  • Dienstag, 3. Mai 2011 06:46
    Beantworter
  • Hallo Marco,

    habe jetzt versucht das so wie in dem Artikel umzubauen, aber er kann noch immer nicht den Namen von IsLockEnabled auflösen, ich komm nicht drauf warum.

    Der Code sieht jetzt so aus:

    <StackPanel Margin="0" Tag="{Binding Path=Tag, ElementName=RootElement}">
          <ListView Margin="5" 
               Name="lstData" 
               Height="224" 
               ItemsSource="{Binding}" 
               ItemContainerStyle="{StaticResource ListViewItemStyle}"           
               >
            <ListView.ContextMenu>
              <ContextMenu Name="cmMenu" 
                    
               HasDropShadow="True">
                <MenuItem Header="{x:Static prop:Resources.mnuContextMove}" Click="OnContextMenuMOVE">
                  <MenuItem.Icon>
                    <Image Source="/DesktopCleanUp;component/Icons/move.ico"></Image>
                  </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="{x:Static prop:Resources.mnuContextLock}" 
               DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
               IsEnabled="{Binding Mode=TwoWay, Path=Tag}" 
               Click="OnContextMenuLOCK">
                  <MenuItem.Icon>
                    <Image Source="/DesktopCleanUp;component/Icons/lock16x16.ico"></Image>
                  </MenuItem.Icon>
                </MenuItem>
                <MenuItem Header="{x:Static prop:Resources.mnuContextDelete}" Click="OnContextMenuDELETE">
                  <MenuItem.Icon>
                    <Image Source="/DesktopCleanUp;component/Icons/delete16x16.ico"></Image>
                  </MenuItem.Icon>
                </MenuItem>
              </ContextMenu>
            </ListView.ContextMenu>
    

    Das "RootElement" löst er noch richtig auf aber das war auch schon :-/ Woran kanns denn liegen? gibts nicht irgendwo eine brauchbare Anleitung wie diese Ganzen Datenbinding Sachen funktionieren und welche Propertys ode Variablen aus der MainWindow Klasse wie im XAML sichtbar sind?

    lg. Johannes

    Dienstag, 3. Mai 2011 11:21