Bu WPF veya Catel hakkında anlamadığım bir şey olup olmadığından emin değilim, ancak farklı düğüm türleri için 3 veri tabanına sahip bir ağaç görünümüm var. Düğüm tiplerinden 2'si bir silme düğmesine bağlanabilir. Düğme komutunun bağlanması, ana denetimin görünüm modülüne bağlanır (düğümün kendisinden ziyade) ve düğmenin tıklatıldığı düğümün bir komut parametresi geçirilir. Veri şablonlardan biri küçük bir parçasını temin ediyorum (her şey burada girmek için çok büyük):Düğümde düğmenin Treeview bağlaması CanExecute issue
<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 (yine sadece küçük özü):
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; }
}
sorundur Ağacı ilk olarak oluşturulduğunda, komut parametresi her zaman boş olur ve parametre boşsa, CanExecute testim false değerini döndürür. Ağacım ilk olarak görüntülendiğinde, tüm düğmelerim devre dışı bırakıldı.
Ancak, düğmelerden herhangi birini tıklatırsam, bunların tümü yeniden değerlendirilir ve etkin hale gelir çünkü artık komut parametresi doğru şekilde iletilmektedir. Ben ekleyerek denedim
: UI yüklenir ancak bu işe görünmüyor sonuçta komutları yeniden değerlendirmek için bir girişim
protected override Task InitializeAsync()
{
CommandManager.InvalidateRequerySuggested();
ViewModelCommandManager.InvalidateCommands(true);
return base.InitializeAsync();
}
. Burada neyi özlüyorum?
teşekkür, ben her iki seçeneği denedik ve ne çalışıyor gibi görünüyor. Belki de daha derine dalmam ve kaynağını ayıklamam gerek. Belki de InvalidateCommands'ın fareyi tıklatmakla aynı şeyi yapmadığını açıklayan kapakların altında bir şeyler oluyor. – Bitfiddler
Nesneyi parametre olarak kullanmayı deneyin, o gece sorunu bulmanıza yardımcı olun –
Nesneyi kullanarak denenmiş, maalesef parametre ilk kez ağacın görüntülendiği sırada sıfırdır. – Bitfiddler