2010-06-22 15 views
7

WPF uygulamasında Komutları ve CommandParameter bağlaçlarını Düğmelerle bağlamaya çalışıyorum. Bu kodun sadece Silverlight'ta gayet iyi çalıştığını görüyorum, bu yüzden neyi yanlış yaptığımı merak ediyorum! Benim Silverlight uygulaması ileWPF KomutuParameter bağdaştırıcısı güncellenmiyor

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     combo.ItemsSource = new List<string>(){ 
      "One", "Two", "Three", "Four", "Five" 
     }; 

     this.DataContext = this; 

    } 

    public TestCommand TestCommand 
    { 
     get 
     { 
      return new TestCommand(); 
     } 
    } 

} 

public class TestCommand : ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     return parameter is string && (string)parameter != "Two"; 
    } 

    public void Execute(object parameter) 
    { 
     MessageBox.Show(parameter as string); 
    } 

    public event EventHandler CanExecuteChanged; 

} 

:

<Window x:Class="WPFCommandBindingProblem.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <StackPanel Orientation="Horizontal"> 
     <ComboBox x:Name="combo" VerticalAlignment="Top" /> 
     <Button Content="Do Something" Command="{Binding Path=TestCommand}" 
       CommandParameter="{Binding Path=SelectedItem, ElementName=combo}" 
       VerticalAlignment="Top"/>   
    </StackPanel> 
</Window> 

kod arkasında aşağıdaki gibidir:

komut parametresi combobox SelectedItem bağlı bir açılan kutu ve bir düğme var combobox'ın SelectedItem'i değiştikçe, CommandParameter bağlaması, komutumun seçili olan öğeyle yeniden değerlendirilebilmesi için CanExecute yönteminin kullanılmasına neden olur ve düğmenin etkin durumu buna göre güncellenir.

WPF ile, herhangi bir nedenle, yalnızca XAML ayrıştırıldığında ciltleme oluşturulduğunda CanExecute yöntemi çağrılır.

Herhangi bir fikrin var mı?

cevap

8

Sen CanExecute değişebileceğini WPF söylemek gerekir - bu gibi TestCommand sınıfında otomatik olarak yapabilirsiniz:

public event EventHandler CanExecuteChanged 
{ 
    add{CommandManager.RequerySuggested += value;} 
    remove{CommandManager.RequerySuggested -= value;} 
} 

WPF sonra her görünümünde bir özellik değişikliklerini CanExecute soracaktır.

+0

bu, değişiklik yapan kullanıcı arayüzündeki tüm özellikler için tüm komutları yeniden değerlendirecek mi? ve Delege komutları ile kullanmak için yolu yok? Bunun gümüşte olduğu gibi bunun için daha basit veya ootb çözümü yok mu? – Firo

+0

Bu sadece en basit yoldur - CanExecuteChanged olayını ne zaman arayacağınızı kontrol edersiniz - burada çerçeve güncellenmiş olabileceğine karar verdiğinde güncellemeyi ayarlıyorum. – Goblin

İlgili konular