2016-04-14 15 views
0

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?

cevap

0

Komut parametresi ve komut nesnesinin sırasını değiştirmeyi deneyin. Bunun nedeni, CommandParameter'ın çiftlenebilir olmaması ve herhangi bir değişiklik bildirimi yükseltmemesidir. Bu nedenle, komut "güncelleme" den sonra yeniden değerlendirilmiyor (hala başlangıç ​​bağlama işlemi). Bu işe yaramazsa

, bu olabilir gibi bir şey: önerileri Geert için

protected override async Task InitializeAsync() 
{ 
    await base.InitializeAsync(); 

    _dispatcherService.BeginInvoke(() => ViewModelCommandManager.InvalidateCommands(true);); 
} 
+0

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

+0

Nesneyi parametre olarak kullanmayı deneyin, o gece sorunu bulmanıza yardımcı olun –

+0

Nesneyi kullanarak denenmiş, maalesef parametre ilk kez ağacın görüntülendiği sırada sıfırdır. – Bitfiddler