Nicht sicher, ob dies etwas ist, was ich nicht verstehe über WPF oder über Catel, aber ich habe eine Baumansicht mit 3 Datamplates für verschiedene Knotentypen. 2 der Knotentypen können an eine Löschtaste gebunden werden. Die Bindung des Schaltflächenbefehls bindet an das Ansichtsmodell des übergeordneten Steuerelements (und nicht an den Knoten selbst), und ein Befehlsparameter des Knotens, auf den geklickt wurde, wird übergeben. Ich bin ein kleiner Ausschnitt aus einem der Datenvorlagen bieten (die ganze Sache ist zu groß, zu betreten):Treeview-Bindung der Schaltfläche am Knoten CanExecute-Problem
<Grid Margin="10" x:Name="CriteriaGrid">
<TreeView ItemsSource="{Binding Criteria}" >
<DataTemplate DataType="{x:Type self:Leaf}">
<Button Command="{Binding Source={x:Reference CriteriaGrid}, Path=DataContext.DeleteLeaf}"
CommandParameter="{Binding}">X</Button>
</DataTemplate>
</TreeView>
</Grid>
Viewmodel (wieder nur ein kleiner Auszug):
public class ManageCriteriaViewModel : ViewModelBase
{
public ManageCriteriaViewModel()
{
DeleteLeaf = new Command<Leaf>(OnDeleteLeaf, CanDeleteLeaf);
}
private bool CanDeleteLeaf(Leaf leafNode)
{
return (leafNode?.Parent as Group) != null;
}
private void OnDeleteLeaf(Leaf leafNode)
{
// Some code
}
public Command<Leaf> DeleteLeaf { get; private set; }
}
Das Problem ist, Wenn der Baum anfänglich konstruiert wird, ist der Befehlsparameter immer Null, und mein CanExecute-Test gibt false zurück, wenn der Parameter null ist. Wenn mein Baum anfänglich angezeigt wird, sind alle meine Schaltflächen deaktiviert.
Wenn ich jedoch auf eine der Schaltflächen klicke, werden alle von ihnen neu bewertet und aktiviert, weil jetzt der Befehlsparameter korrekt übergeben wird.
Ich habe versucht, und fügte hinzu:
protected override Task InitializeAsync()
{
CommandManager.InvalidateRequerySuggested();
ViewModelCommandManager.InvalidateCommands(true);
return base.InitializeAsync();
}
In einem Versuch, alle Befehle neu zu bewerten, nachdem die Benutzeroberfläche geladen, aber das scheint nicht zu funktionieren. Was fehlt mir hier?
Danke für die Vorschläge Geert, habe ich versucht, beide Optionen und weder scheint zu funktionieren. Vielleicht muss ich tiefer tauchen und die Quelle debuggen. Vielleicht passiert etwas unter dem Deckblatt, das erklären würde, warum InvalidateCommands nicht dasselbe tut wie das Klicken mit der Maus. – Bitfiddler
Versuchen Sie stattdessen, das Objekt als Parameter zu verwenden. In dieser Nacht helfen Sie, das Problem zu finden –
Mit Objekt versucht, leider ist der Parameter einfach null, wenn der Baum zum ersten Mal angezeigt wird. – Bitfiddler