Очевидно, что вы не используете Commanding (ICommand Interface
).Вы должны либо использовать это (и предпочтительно архитектуру Model-View-ViewModel).
Но, если вы хотите придерживаться кода и XAML:
<ListView SelectionChanged="AccountListView_SelectionChanged" ... />
private void AccountListView_SelectionChanged(Object sender, SelectionChangedEventArgs args)
{
DebitButton.IsEnabled = (sender != null);
//etc ...
}
Подробнееинформация о MVVM: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
Вам необходимо установить DataContext для View (UserControl) для экземпляра ViewModel, который вы хотите использовать.Затем оттуда вы можете связать свойства ViewModel, включая ICommand
s.Вы можете использовать RelayCommand
(см. Ссылку выше) или использовать Commanding, предоставляемый платформой (например, Prism предоставляет DelegateCommand
).Эти команды принимают Action (Выполнить) и Func (CanExecute).Просто предоставьте логику в вашем CanExecute.Конечно, вам также нужно, чтобы ваш ListView SelectedItem (или SelectedValue) был привязан к свойству в свойстве ViewModel, чтобы вы могли проверить, является ли он пустым в вашей функции CanExecute.
Предполагается, что вы используете RelayCommand
вам не нужно явно вызывать RaiseCanExecuteChanged
из ICommand
.
public class MyViewModel : ViewModelBase //Implements INotifyPropertyChanged
{
public MyViewModel()
{
DoSomethingCommand = new RelayCommand(DoSomething, CanDoSomething);
}
public ObservableCollection<Object> MyItems { get; set; }
public Object SelectedItem { get; set; }
public RelayCommand DoSomethingCommand { get; set; }
public void DoSomething() { }
public Boolean CanDoSomething() { return (SelectedItem != null); }
}
<ListView ItemsSource="{Binding MyItems}" SelectedItem="{Binding SelectedItem}" ... />
<Button Command="{Binding DoSomethingCommand}" ... />