| 

.NET C# Java Javascript Exception

5
Hallo, ich entwickle zurzeit eine WPF Anwendung mit dem MVVM Pattern. Ich habe eine Baumstruktur, bei der beim Rechtenmausklick auf einen Knoten sich ein ContextMenü öffnen soll. Dieses ContextMenu soll sich abhängig von dem Knoten, dynamisch aufbauen. Das ContextMenu bekommt als ItemSource ein ObservableCollection. Mein Problem wo ich schon seit einigen Tagen nicht weiter komme ist folgendes. Wenn das ContextMenu aufgebaut wird, sehe ich den richtigen Namen des MenuItems, doch das Command für dieses MenuItem wird nicht ausgeführt. Kann mir da vielleicht jemand bitte weiter helfen?

Ich habe in meinem ViewModel eine Property ObservableCollection<HTreeMVVM.Helper.MenuItem> MenuSource, das HTreeMVVM.Helper.MenuItem Klasse sieht folgend aus.

public class MenuItem
{
private String _name;
public String Name { get { return _name; } set { _name = value; } }
private String _command;
public String Command { get { return _command; } set { _command = value; } }

public MenuItem(string name, string command)
{
this._name = name;
this._command = command;
}
}
}


Die Collection wird om ViewModel folgend initialisiert:
HTreeMVVM.Helper.MenuItem m1 = new HTreeMVVM.Helper.MenuItem("Wechsel", "{Binding Path=ClickCommand}");
MenuSource.Add(m1);


Und ClickCommand in ViewModel:

public ICommand ClickCommand { get { return new BaseCommand(Click); } }


Das ContextMenu in XAML sieht folgend aus:

<DataTemplate x:Key="MyDataTemplate">
<Button
DataContext="{Binding Path=Node}"
Content="{Binding Path=MyName}"
Style="{StaticResource RedAquaGelButtonTemplateStyle}"
Background="sc#1, 0.979549646, 0.6541397, 0.0275757164">

<Button.ContextMenu>
<ContextMenu DataContext="{Binding Source={StaticResource vM}}" ItemsSource="{Binding Path=MenuSource}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Command" Value="{Binding Command}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</Button.ContextMenu>

</Button>
</DataTemplate>
10.01.2012
gregrisk 57 3
2 Antworten
1
Wenn du ein Command ausführen willst, musst die Klasse ICommand statt string als Typ des Commands angeben.

statt:
private String _command;
public String Command { get { return _command; } set { _command = value; } }


lieber:
private ICommand _command;
public ICommand Command { get { return _command; } set { _command = value; } }
12.01.2012
Hendrik Lösch 1,4k 8
0
Hallo Hendrik Lösch, Danke für dir schnelle Antwort. Das war der Fehler, dass ich String anstatt ICommand verwendet habe.

Ich habe jetzt eine andere Frage, wie kann ich an meine Command-Methoden Parameter übergeben und diese dort verarbeiten. Also wie sollte meine BaseCommand Klasse aussehen.

Zurzeit sieht sie so aus
internal class BaseCommand : ICommand
{
private readonly Action _command;
private readonly Func<bool> _canExecute;

public BaseCommand(Action command, Func<bool> canExecute = null)
{
if (command == null)
throw new ArgumentNullException("command");
_canExecute = canExecute;
_command = command;
}

public void Execute(object parameter)
{
_command();
}

public bool CanExecute(object parameter)
{
if (_canExecute == null)
return true;
return _canExecute();
}

public event EventHandler CanExecuteChanged;
}



Ich wäre sehr dankbar für einen Tipp, leider finde ich im Internet nichts passendes.
16.01.2012
gregrisk 57 3
Du solltest die Frage als eigenständige Frage stellen, damit sie von anderen leichter gefunden werden kann. Dann ist es auch leichter zu antworten, da man hier in die Kommentare nicht viel schreiben kann...
Hendrik Lösch 17.01.2012

Stelle deine .net-Frage jetzt!