Kontext-Menü Elemente den Befehl binding in WPF mit MVVM
Ich weiß, diese Frage wurde oft gefragt, in unterschiedlicher Weise in vielen Webseiten und auch in StackOverFlow, aber all die Antworten, die ich fand, sind nicht helfen, mich ot um genau zu sein ich bin nicht in der Lage, Sie zu verstehen und umzusetzen, in meiner Anwendung. Also ich dachte an etwas code aus meiner Anwendung so, dass Sie Menschen helfen kann, besser zu mir.
Anweisung Problem : ich bin mit einem WPF DataGrid. Ich habe eine Kontextmenü und ich haben 3 Optionen Ausschneiden,Kopieren,Einfügen. Ich bin mit MVVM für die Entwicklung. Ich möchte DataBind Sie diese Optionen, um Befehle in meinem ViewModel. Aber ich bin nicht in der Lage, das gleiche zu tun. Der Kontext-Menü-Optionen sind nicht immer Daten gebunden an alle !!!
Dies ist mein Grid Code in der XAML :
<custom:DataGrid
x:Name="DataGrid_Standard"
Grid.Row="1" Grid.Column="1"
AutoGenerateColumns="False"
IsSynchronizedWithCurrentItem="True"
Background="Transparent"
ItemsSource="{Binding FullGridData}"
ItemContainerStyle="{StaticResource defaultRowStyle}"
ColumnHeaderStyle="{StaticResource DefaultColumnHeaderStyle}"
Grid.ColumnSpan="2">
Dann habe ich ein ContextMenu und einen Stil Header-Element
<ContextMenu x:Key="columnHeaderMenu">
<MenuItem Command="{Binding CutCommand}"
Header="Test" />
<MenuItem Header="Copy"/>
<MenuItem Header="Paste"/>
</ContextMenu>
<Style TargetType="{x:Type custom:DataGridColumnHeader}" x:Key="DefaultColumnHeaderStyle">
<Setter Property="ContextMenu" Value="{DynamicResource columnHeaderMenu}" >
</Style>
Diese Linie geht in meinen Konstruktor
public Window1()
{
this.DataContext = new AppData();
}
Dieser code geht in meinem AppData-Klasse:
public class AppData
{
private IList<GridData> fullGridData = new ObservableCollection<GridData>();<br>
public IList<GridData> FullGridData
{
get { return fullGridData; }
set { fullGridData = value; }
}
private DelegateCommand<object> cutCommand;
public DelegateCommand<object> CutCommand
{
get
{
if (cutCommand == null)
{
cutCommand = new DelegateCommand<object>(CutColumn);
}
return cutCommand;
}
}
private void CutColumn(object obj)
{
//some code goes here
}
}
** Ich will wissen, wo genau mache ich falsch?? Warum ist das DataBinding nicht passiert??
Bitte helfen Sie mir über diese. Bitte stellen Sie mir den Beispiel-code oder änderungen in meinem code, von dem ich es erreichen kann. **
InformationsquelleAutor GuruC | 2010-10-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche Problem. Der Befehl Bindungen aufgehört zu arbeiten, sobald ich zog Sie auf das ViewModel aus dem code hinter. Und im viewmodel musste ich meine ICommand aus RoutedCommand zu DelegateCommand. Ich war in der Lage, um es arbeiten in der folgenden Weise -
Hinzufügen Geöffnet-Event-Handler den Kontext-Menü -
In der code-behind weisen Sie Ihre ViewModel, um das Kontext-Menü die DataContext -
InformationsquelleAutor dev27
Ich in der Regel instanziieren meiner Ansicht Modell als statische Ressource aus meiner Sicht:
Dann können Sie ganz einfach Verweis auf eine Eigenschaft der view-Modell, auch wenn der aktuelle binding-Kontext ist nicht der Auffassung, Modell:
Weitere Informationen, haben Sie einen Blick auf meine Artikel Empfehlungen und best practices für die Implementierung von MVVM und XAML/.NET-Anwendungen.
InformationsquelleAutor Rico Suter
Etwas in Ihrem code (oder die version von WPF verwendet wird, um die Zeit(?)) ist overcomplicating Dinge. Ich bin in der Lage zu binden, wie
Wo der Befehl ist wie folgt aufgebaut:
InformationsquelleAutor ΩmegaMan
InformationsquelleAutor Denis Fedak
Haben Sie zwei Möglichkeiten.
Hinweis: die code-Beispiele Hinzugefügt habe ich hier ein ähnliches, aber nicht dasselbe wie Ihre Proben.
Verschieben Sie die definition des ContextMenu innerhalb des DataGrid-defintion wie folgt:
Oder besser eine CommandReference, um Ihre Ressourcen und setzen Sie den Befehl in das MenuItem, um eine StaticResource wie folgt:
Es funktionierte für mich, aber ich bin nicht sicher, was die Umsetzung von DelegateCommand, die Sie verwenden, schauen Sie auf den zweiten Parameter, der steuert, ob der Befehl aktiviert ist oder nicht. Ich habe eine Probe hier: cutCommand = new DelegateCommand<object>(CutColumn, CanCutCommand); private bool CanCutCommand(object obj) { return true; }
Ich bin mit DelegateCommand verfügbar in mvvm toolkit von codeplex. Ich habe gesehen, wie einige websites, die Sie sagen, sein Fehler. Die links sind wie folgt : connect.microsoft.com/VisualStudio/feedback/details/421816/... social.msdn.microsoft.com/Forums/en-US/wpf/thread/...
meine menuitem Befehle funktionieren nicht wie erwartet als gut..
InformationsquelleAutor Zamboni