Laden...

WPF PRISM Binding. Menü bestehend aus Buttons zur Laufzeit erzeugen.

Erstellt von jok3r89 vor 5 Jahren Letzter Beitrag vor 5 Jahren 4.000 Views
J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren
WPF PRISM Binding. Menü bestehend aus Buttons zur Laufzeit erzeugen.

Hallo,
Ich komme gerade nicht mehr weiter. Ich arbeite mich gerade in Prism und den Regionen ein.
Ich hab links in meiner GUI ein Menü, anfangs habe ich für jeden Eintrag einen Button erstellt. Jetzt würde ich gerne den Button einer Liste im Code(ViewModel) zuweisen, die GUI soll dann zur Laufzeit die Buttons über ein Template erzeugen.( Ich hoffe das war richtig/verständlich formuliert).

Ich bin gerade ein wenig überfragt was hier schief läuft, ich komme gar nicht mehr weiter und dachte anfangs es wäre nicht so schwer...
Vielen dank schon mal für eure Hilfe

Gruß

V
12 Beiträge seit 2017
vor 5 Jahren

Hi, ist gar nicht so leicht dir zu helfen wenn du nicht sagst wo das Problem genau liegt.

Ich tippe aber mal darauf das dir die MenuBtn nicht auf der UI angezeigt werden.
Das liegt daran das du die falsche Liste befüllst.

Du fügst die Button einer Konstuktorlokalen variablen Liste hinzu, nicht der eigentlichen Liste des ViewModels.

16.834 Beiträge seit 2008
vor 5 Jahren

Bild-Link gelöscht, bitte [Hinweis] Wie poste ich richtig? Punkt 6.1 beachten

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Dafür war es gestern wohl zu spät, jetzt gehts natürlich!

Ich frage mich gerade wie macht man den das Zeichnen/Designen der Elemente wenn man sie nicht sieht. Wie in diesem Beispiel mit den Buttons

<UserControl x:Class="ThePLCProject.Ui.Desktop.Views.LeftMenu"
             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"
             mc:Ignorable="d" 
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True"
             d:DesignHeight="300" d:DesignWidth="300">
    <ItemsControl ItemsSource="{Binding MenuItems}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button Width="78"
                    Height="25"
                    Margin="10"
                    Content="{Binding Path=NavigationItemName}"
                    Command="{Binding Path=NavigationToCommand}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</UserControl>

V
12 Beiträge seit 2017
vor 5 Jahren

Dafür gibt es die Möglichkeit sich Designzeitdaten anzeigen zu lassen.

Siehe: Beispieldaten für die Entwurfsoberfläche und Prototyperstellung

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Okay Danke, ich bleib doch lieber bei der Lösung im Run die Änderungen vorzunehmen.

Ich arbeite gerade an meinem Menü, und dabei ist mir aufgefallen das ein ClickEvent in einem Menu item nur genau einmal bei mir ausgeführt wird.
Wie man sieht steht ein Textfeld für ein Menu item.
Das Event hab ich via <TextBlock.InputBindings> angehängt.
Jedes Item funktioniert aber leider nur einmal....
Was sehr verwunderlich ist wenn ich das ganze auf ein Button object umarbeite funktioniert es prima.
(Ich benutze keinen Button weil ich den Style nicht brauche).

           <ListView ItemsSource="{Binding Path=MenuItems}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="50 0" Height="60" RenderTransformOrigin="0.5,0.5">
                            <materialDesign:PackIcon Kind="{Binding Path= NavigationIcon}" Width="30" Height="30" VerticalAlignment="Center" Margin="5"/>
                            <TextBlock Text="{Binding Path= NavigationName}" Margin="10" VerticalAlignment="Center">
                                <TextBlock.InputBindings>
                                    <MouseBinding Command="{Binding Path= NavigationToCommand}" MouseAction="LeftClick" />
                                </TextBlock.InputBindings>
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>

Kann sich das jemand erklären?

5.658 Beiträge seit 2006
vor 5 Jahren

Hi jok3r89,

also ich kann dir beim besten Willen nicht folgen. Ich verstehe weder deinen Lösungsansatz, noch das Problem, das sich daraus ergibt.

Für Menüs gibt es doch das MenuItem-Control, da ist alles schon vorbereitet, auch das Mouse- und Keyboard-EventHandling. Wenn dir nicht gefällt, wie es aussieht, dann brauchst du nur die Styles und/oder Templates anzupassen. Warum verwendest du also nicht die Controls für ein Menü, die dafür vorgesehen sind?

Wenn du Styles und Templates mit einem grafischen Editor erstellen willst, dann kannst du dafür Blend benutzen (falls es das überhaupt noch gibt).

Weeks of programming can save you hours of planning

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Ich wollte mir ein Menü mit den Mechanismen die mir Prism liefert selbst bauen(siehe Anhang). Das Menü kann aus und eingeblendet werden, ebenso bleibt der Menu Button sichtbar angewählt wenn er mal gedrückt worden ist.

Ich kämpfe nur (noch) mit zwei Problemen

  1. Der UserControl Aufruf funktioniert nur einmal oder auch mal nach mehrmaligen klicken nochmal...

2.Ich habe zwei Button im Menü einer blendet mir das Menü aus und der andere wieder ein. Dafür benutze ich einen Converter "BooleanToVisibilityConverter".
Ich verwende das MVVM Pattern nur damit gelinkt mir das ganze nicht.
Funktioniert hätte es schon mal über eine Code Behind Lösung, nur das war nicht mein Ziel. Ich kann über die Variablen im Constructor "BtnOpenVisibility, BtnCloseVisibility" die Button sichtbar/unsichtbar machen aber spätestens über die Methoden geht es nicht mehr.

Ich will hier jetzt keine Grundsatz Diskussion starten, ich würde das nur gerne hin bekommen egal ob der Ansatz nicht ganz richtig ist. Ich beschäftige mich erst seit kurzem mit MVVM und WPF also wäre Nachsichtigkeit sehr nett 😉

Schon mal vielen Dank

<UserControl x:Class="ThePLCProject.Ui.Desktop.Views.LeftMenu"
             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:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
             mc:Ignorable="d" 
             xmlns:prism="http://prismlibrary.com/"
             xmlns:converter="clr-namespace:ThePLCProject.Ui.Desktop.Converter"
             prism:ViewModelLocator.AutoWireViewModel="True">
    <UserControl.Resources>
        <BooleanToVisibilityConverter x:Key="BoolToVis"/>

        <Style TargetType="{x:Type Menu}" >
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Foreground" Value="Transparent"/>
        </Style>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Foreground" Value="Transparent"/>
        </Style>

        <Storyboard x:Key="OpenMenu">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="GridMain">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="150"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="GridMain">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="StackPanelMenu">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="170"/>
            </DoubleAnimationUsingKeyFrames>

            <!--DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="listViewItem">
                <EasingDoubleKeyFrame KeyTime="0" Value="-250"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="-250"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.7" Value="0"/>
            </-->

        </Storyboard>
        <Storyboard x:Key="CloseMenu">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="GridMain">
                <EasingDoubleKeyFrame KeyTime="0" Value="150"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)" Storyboard.TargetName="GridMain">
                <EasingDoubleKeyFrame KeyTime="0" Value="0"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)" Storyboard.TargetName="StackPanelMenu">
                <EasingDoubleKeyFrame KeyTime="0" Value="170"/>
                <EasingDoubleKeyFrame KeyTime="0:0:0.5" Value="0"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </UserControl.Resources>

    <UserControl.Triggers>
        <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="ButtonOpenMenu">
            <BeginStoryboard Storyboard="{StaticResource OpenMenu}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="ButtonBase.Click" SourceName="ButtonCloseMenu">
            <BeginStoryboard x:Name="CloseMenu_BeginStoryboard" Storyboard="{StaticResource CloseMenu}"/>
        </EventTrigger>
    </UserControl.Triggers>

    <Grid>
        <StackPanel x:Name="StackPanelMenu" HorizontalAlignment="Center" Margin="-250 0 0 0" RenderTransformOrigin="0.5,0.5" Background="#FF3580BF">
            <StackPanel.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </StackPanel.RenderTransform>
            <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Height="100" HorizontalAlignment="Center">
                <Button Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}" Background="{x:Null}" BorderBrush="{x:Null}" Padding="0" Width="50" Height="50" Margin="10">
                    <materialDesign:PackIcon Kind="Settings" Width="40" Height="40"/>
                </Button>
            </StackPanel>
            <ListView ItemsSource="{Binding Path=MenuItems}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="50 0" Height="60" RenderTransformOrigin="0.5,0.5">
                            <materialDesign:PackIcon Kind="{Binding Path= NavigationIcon}" Width="30" Height="30" VerticalAlignment="Center" Margin="5"/>
                            <TextBlock Text="{Binding Path= NavigationName}" Margin="10" VerticalAlignment="Center">
                                <TextBlock.InputBindings>
                                    <MouseBinding Command="{Binding Path= NavigationToCommand}" MouseAction="LeftClick" />
                                </TextBlock.InputBindings>
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>

        <Grid x:Name="GridMain" Background="#FF3580BF" Width="40" RenderTransformOrigin="0.5,0.5">
            <Grid.RenderTransform>
                <TransformGroup>
                    <ScaleTransform/>
                    <SkewTransform/>
                    <RotateTransform/>
                    <TranslateTransform/>
                </TransformGroup>
            </Grid.RenderTransform>
            <Grid>
                <Button x:Name="ButtonOpenMenu" 
                        Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}" 
                        Width="30" 
                        Height="30" 
                        Padding="0" 
                        Background="{x:Null}" 
                        BorderBrush="{x:Null}" 
                        VerticalAlignment="Top"
                        HorizontalAlignment="Left"
                        Margin="5" 
                        Command="{Binding OpenMenuCommand}"
                        Visibility="{Binding BtnOpenVisibility, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}">
                    <materialDesign:PackIcon Kind="Menu" Foreground="#FFFBFBFB"/>
                </Button>
                <Button x:Name="ButtonCloseMenu"
                        Style="{StaticResource MaterialDesignFloatingActionMiniAccentButton}"
                        Width="30"
                        Height="30"
                        Padding="0"
                        Background="{x:Null}"
                        BorderBrush="{x:Null}" 
                        VerticalAlignment="Top"
                        Margin="10 30" 
                        Command="{Binding CloseMenuCommand}"
                        Visibility="{Binding BtnCloseVisibility, Converter={StaticResource BoolToVis}, FallbackValue=Collapsed}">
                    <materialDesign:PackIcon Kind="Menu" Foreground="#FFFBFBFB"/>
                </Button>
            </Grid>
        </Grid>
        <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Height="40" HorizontalAlignment="Right" Margin="10"/>
    </Grid>
</UserControl>

using Prism.Commands;
using Prism.Regions;
using Prism.Mvvm;

using System.Windows.Input;
using ThePLCProject.Ui.Region;
using System.Collections.Generic;
using System;
using System.Windows;

using MaterialDesignThemes.Wpf;

namespace ThePLCProject.Ui.Desktop.ViewModels
{	
    public class LeftMenuViewModel : BindableBase
	{
		public ICommand CloseMenuCommand { get; set; }
		public ICommand OpenMenuCommand { get; set; }

		private bool _btnOpenVisibility;
		public bool BtnOpenVisibility
		{
			get { return _btnOpenVisibility; }
			set
			{
				_btnOpenVisibility = value;
				SetProperty(ref _btnOpenVisibility, value);
			}
		}

		private bool _btnCloseVisibility;
		public bool BtnCloseVisibility
		{
			get { return _btnCloseVisibility; }
			set
			{
				_btnCloseVisibility = value;
				SetProperty(ref _btnCloseVisibility, value);
			}
		}

		public List<MenuBtn> MenuItems { get; set; }

		public class MenuBtn
		{	
			public ICommand NavigationToCommand { get; set; }
			public String NavigationIcon { get; set; }
			public String NavigationName { get; set; }
		}

		private readonly IRegionManager _regionManager;

        public LeftMenuViewModel(IRegionManager regionManager)
        {
            _regionManager = regionManager;

			MenuItems = new List<MenuBtn>();
			MenuItems.Add(new MenuBtn() { NavigationToCommand = new DelegateCommand(() => NavigateTo("MainPage")), NavigationIcon = PackIconKind.Home.ToString(), NavigationName = "Home"});
			MenuItems.Add(new MenuBtn() { NavigationToCommand = new DelegateCommand(() => NavigateTo("TagPage")), NavigationIcon = PackIconKind.Lan.ToString(), NavigationName = "Properties" });
			MenuItems.Add(new MenuBtn() { NavigationToCommand = new DelegateCommand(() => NavigateTo("ScriptingPage")), NavigationIcon = PackIconKind.Script.ToString(), NavigationName = "Script" });
			MenuItems.Add(new MenuBtn() { NavigationToCommand = new DelegateCommand(() => NavigateTo("LogPage")), NavigationIcon = PackIconKind.History.ToString() , NavigationName = "Log" });

			CloseMenuCommand = new DelegateCommand(CloseMenu);
			OpenMenuCommand = new DelegateCommand(OpenMenu);

			BtnOpenVisibility = true;
			BtnCloseVisibility = false;
		}

        private void NavigateTo(string url)
        {
            _regionManager.RequestNavigate(Regions.ContentRegion, url);
        }

		private void OpenMenu()
		{
			//ButtonOpenMenu.Visibility = Visibility.Collapsed;
			//ButtonCloseMenu.Visibility = Visibility.Visible;
			BtnOpenVisibility = false;
			BtnCloseVisibility = true;
		}

		private void CloseMenu()
		{
			//ButtonOpenMenu.Visibility = Visibility.Visible;
			//ButtonCloseMenu.Visibility = Visibility.Collapsed;
			BtnOpenVisibility = true;
			BtnCloseVisibility = false;
		}
	}
}

5.658 Beiträge seit 2006
vor 5 Jahren

Der einfachste Weg, etwas ein- und auszublenden, ist:

  • Im ViewModel eine Eigenschaft vom Typ Boolean erstellen
  • Im Style einen DataTrigger für diese Eigenschaft erstellen
  • Im Trigger dann die Visible- oder Transform-Eigenschaft setzen

Das Ganze kann man auch erstmal komplett ohne Animationen und Storyboards umsetzen, bis es richtig funktioniert.

Weeks of programming can save you hours of planning

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Ich bin mir gerade nicht sicher, denkst du der Ansatz ist falsch oder nur eben zum Fehler suchen ?

Wie oben schon beschrieben( evtl. nicht sehr ausführlich) hab ich das ganze stückweit aufgebaut, und an diesem Punkt gehts nicht mehr weiter..

Und die Code Behind Lösung von davor im View ala

		
private void OpenMenu()
		{
			//ButtonOpenMenu.Visibility = Visibility.Collapsed;
			//ButtonCloseMenu.Visibility = Visibility.Visible;...

hatte wunderbar funktioniert

Ich tendiere daher eher auf den Converter, bin aber nach zwei Tagen Googlen nicht weiter gekommen

Gruß

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Okay erstes Problem gelöst.


SetProperty(ref _btnOpenVisibility, value);

ist das Problem

Mit dieser Methode funktioniert es wieder.

				
RaisePropertyChanged("BtnOpenVisibility");

Kann sich das jemand erklären? SetProperty() wäre doch was ich so gelesen habe die einzige Lösung die jeder so vorschlägt.

Gruß

5.658 Beiträge seit 2006
vor 5 Jahren

Der einfachste Weg, etwas ein- und auszublenden, ist:

  • Im ViewModel eine Eigenschaft vom Typ Boolean erstellen
  • Im Style einen DataTrigger für diese Eigenschaft erstellen
  • Im Trigger dann die Visible- oder Transform-Eigenschaft setzen

Das Ganze kann man auch erstmal komplett ohne Animationen und Storyboards umsetzen, bis es richtig funktioniert.

Damit meine ich das Menü, nicht die Buttons. Du willst ein Menü ein- oder ausblenden, wenn ich das alles richtig verstehe. Also solltest du das auch im ViewModel so abbilden.

"Zwei Tage googlen" ohne Erfolg klingt aber für mich nicht, als würdest du besonders systematisch vorgehen. Nach was suchst du denn da?

Weeks of programming can save you hours of planning

5.658 Beiträge seit 2006
vor 5 Jahren

Okay erstes Problem gelöst.

  
SetProperty(ref _btnOpenVisibility, value);  
  

ist das Problem

Nein, das Problem ist, daß du sie falsch anwendest 😉

public bool BtnOpenVisibility
        {
            get { return _btnOpenVisibility; }
            set
            {
                _btnOpenVisibility = value;
                SetProperty(ref _btnOpenVisibility, value);
            }
        }

Wann immer eine Methode ein unerklärliches Verhalten hat, sollte man mal in die Doku zu der Methode schauen. SetProperty setzt das Backing-Field auf den neuen Wert, und löst das PropertyChanged-Ereignis aus, wenn sich der Wert geändert hat. Da du den Wert aber in der Zeile davor jedesmal bereits auf den neuen Wert gesetzt hast, wird das Ereignis nie ausgelöst, und deine UI nicht über die Änderung benachrichtigt. Du mußt also lediglich darauf verzichten, den Wert vor Aufruf der SetProperty-Methode zu setzen.

Weeks of programming can save you hours of planning

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Schon mal danke, ich muss mir zugestehen ich hab sie mir mal durchgelesen aber wohl mehr überflogen...
Ich hätte es wohl nicht so schnell gefunden.

Zu dem anderen Thema mit den Menü Btns, gibt es Möglichkeiten das Feuern der Events zu beobachten ? Ich glaube es liegt hier am Binding der Daten

            <ListView ItemsSource="{Binding Path=MenuItems}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="50 0" Height="60" RenderTransformOrigin="0.5,0.5">
                            <materialDesign:PackIcon Kind="{Binding Path= NavigationIcon}" Width="30" Height="30" VerticalAlignment="Center" Margin="5"/>
                            <TextBlock Text="{Binding Path= NavigationName}" Margin="10" VerticalAlignment="Center">
                                <TextBlock.InputBindings>
                                    <MouseBinding Command="{Binding NavigationToCommand}" MouseAction="LeftClick" />
                                </TextBlock.InputBindings>
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
5.658 Beiträge seit 2006
vor 5 Jahren

Ich glaube es liegt hier am Binding der Daten

Leider wissen wir nicht, was du mit "es" meinst.

Zu den Templates und Bindings gibt es hier Code-Beispiele und ein Beispiel-Projekt: [Artikel] MVVM und DataBinding

Weeks of programming can save you hours of planning

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Ich habe schon mehrfach gelesen das es Probleme macht wenn man durch ein Datatemplate ein Delegate Command auslösen will.

Ich hab es daher via einer RelativeSource versucht.


         <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="50 0" Height="60" RenderTransformOrigin="0.5,0.5">
                            <materialDesign:PackIcon Kind="{Binding Path= NavigationIcon}" Width="30" Height="30" VerticalAlignment="Center" Margin="5"/>
                            <TextBlock Text="{Binding Path= NavigationName}" Margin="10" VerticalAlignment="Center">
                                <TextBlock.InputBindings>
                                    <MouseBinding 
                                        Command="{Binding Path=NavigationToCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"   
                                        MouseAction="LeftClick" />
                                </TextBlock.InputBindings>
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>

Ich kann nur gerade nicht viel mit dieser Meldung anfangen
"System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Documents.List', AncestorLevel='1''. BindingExpression:Path=NavigationToCommand; DataItem=null; target element is 'MouseBinding' (HashCode=2881685); target property is 'Command' (type 'ICommand')
"
und
"
System.Windows.Data Error: 40 : BindingExpression path error: 'NavigationToCommand' property not found on 'object' ''ListView' (Name='MainMenu')'. BindingExpression:Path=NavigationToCommand; DataItem='ListView' (Name='MainMenu'); target element is 'MouseBinding' (HashCode=2881685); target property is 'Command' (type 'ICommand')
"

Gruß

W
955 Beiträge seit 2010
vor 5 Jahren

Er sagt doch dass NavigationToCommand nicht gefunden wird.
Mal blind geraten: Ist das wirklich in der ListView definiert oder sollte da nicht UserControl o.ä. stehen? Arbeitest du mit ViewModels? Dann sollte es vllt DataContext.NavigationToCommand heißen.

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Hallo,
Ja ich arbeite mit ViewModels und mit Prism(AutoWireViewModel ist aktiviert).

Hier ein größerer ausschnitt ich habe die ItemSource vom ListView auf meine Liste gesetzt.

            <ListView x:Name="MainMenu" ItemsSource="{Binding MenuItems}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="50 0" Height="60" RenderTransformOrigin="0.5,0.5">
                            <materialDesign:PackIcon Kind="{Binding Path= NavigationIcon}" Width="30" Height="30" VerticalAlignment="Center" Margin="5"/>
                            <TextBlock Text="{Binding Path= NavigationName}" Margin="10" VerticalAlignment="Center">
                                <TextBlock.InputBindings>
                                    <MouseBinding
                                        Command="{Binding Path=NavigationToCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}"
                                        MouseAction="LeftClick" />
                                </TextBlock.InputBindings>
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
16.834 Beiträge seit 2008
vor 5 Jahren

jok3r89, bitte die XML Tags für XAML und nicht die C# Tags verwenden - hab nun keine Lust mehr die Beiträge dauernd zu editieren 😃

J
jok3r89 Themenstarter:in
70 Beiträge seit 2017
vor 5 Jahren

Also ich hab es aufgegeben,..

Ich arbeite jetzt mit einem Template und der Aufbau ist ein wenig verändert und ja was soll ich sagen es geht. Ich kann mir aber immer noch nicht erklären wieso der andere Ansatz nicht funktionierte evtl meldet sich dazu ja noch jemand

        <DataTemplate x:Key="MenuItemTemplate">
            <Grid Height="60" RenderTransformOrigin="0.5,0.5">
                <Button Command="{Binding Path=NavigationToCommand}" CommandParameter="{Binding}" Style="{x:Null}" Background="Transparent" BorderThickness="0">
                    <StackPanel Orientation="Horizontal" Margin="50 0" Height="60" RenderTransformOrigin="0.5,0.5">
                        <materialDesign:PackIcon Kind="{Binding NavigationIcon}" Width="30" Height="30" VerticalAlignment="Center" Margin="5"/>
                        <TextBlock Text="{Binding Path = NavigationName}" Margin="10" VerticalAlignment="Center" Style="{x:Null}" Background="Transparent" FontSize="15"/>
                    </StackPanel>
                </Button>
            </Grid>
        </DataTemplate>

v

  
          <ListBox x:Name="allToDoItemsListBox" 
             ItemsSource="{Binding MenuItems,Mode=OneWay}" 
             ItemTemplate="{StaticResource MenuItemTemplate}"
             HorizontalAlignment="Right"/>

Grüße