Как отключить кнопку, если в ListView не выбран ни один элемент - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть ListView, содержащийся в UserControl Я хотел бы отключить кнопку, когда в UserControl не выбран ни один элемент, будет ли это правильным способом? Пока что он не отключается, он остается включенным до конца. Я включил код xaml.

searchAccountUserControl - это свойство имени UserControl в xaml. И AccountListView - это свойство ListView name в userControl xaml.

<Button Content="Debit" IsEnabled="true" HorizontalAlignment="Left" Margin="18,175,0,0" Name="DebitButton" Width="128" Grid.Column="1" Height="32" VerticalAlignment="Top" Click="DebitButton_Click">
        <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=searchAccountUserControl.AccountListView, Path=SelectedValue}" Value="{x:Null}" >
                        <Setter Property="Button.IsEnabled" Value="false"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

Спасибо.

Наконец-то я использовал:

в моей ViewModel:

private bool _isSelected;
public bool IsSelected { get { return _isSelected; } 
set { _isSelected = _account.View.CurrentItem != null;       
PropertyChanged.SetPropertyAndRaiseEvent(this, ref _isSelected, value,  
ReflectionUtility.GetPropertyName(() => IsSelected)); } } 

А затем используйте isEnabled = "{Binding Path = IsSelected}" в xaml.

Ответы [ 2 ]

21 голосов
/ 17 ноября 2011

Здесь несколько вещей не так.

  1. Приоритет , если вы установите IsEnabled на самом элементе управления, стиль никогда не сможет его изменить.

  2. ElementName , это ElementName, а не путь, только одна строка, которая дает имя одного элемента. Все, что за этим, идет в Путь .

  3. Синтаксис стиля: если вы установите Style.TargetType, вам не следует устанавливать Setter.Property с префиксом типа (хотя выход из него не нарушает установщик).

Кстати, одного этого достаточно:

<Button IsEnabled="{Binding SelectedItems.Count, ElementName=lv}" ...
2 голосов
/ 17 ноября 2011

Очевидно, что вы не используете 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}" ... />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...