如果在ListView中未选择任何项目,如何禁用按钮

时间:2011-11-17 18:03:47

标签: c# wpf xaml listview user-controls

我有一个ListView包含在UserControl中我想在UserControl中没有选择任何项目时禁用按钮,它是否是正确的方法?到目前为止,它没有禁用,它只是一直保持启用状态。 我已经包含了xaml代码。

searchAccountUserControl是xaml中的UserControl名称属性。 AccountListView是userControl xaml中的ListView name属性。

<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)); } } 

然后在xaml中使用isEnabled =“{Binding Path = IsSelected}”。

2 个答案:

答案 0 :(得分:21)

这里有一些问题。

  1. Precedence,如果您在控件本身设置IsEnabled,则样式将永远无法更改它。

  2. ElementName,它是ElementName,不是路径,只是一个字符串,它给出了一个元素的名称。除此之外的所有内容都会进入Path

  3. 样式语法,如果设置Style.TargetType,则不应将Setter.Property设置为类型前缀(尽管不会破坏设置器)。

  4. 顺便说一下,这就足够了:

    <Button IsEnabled="{Binding SelectedItems.Count, ElementName=lv}" ...
    

答案 1 :(得分:2)

很明显,你没有使用指挥(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

您需要将View(UserControl)的DataContext设置为您要使用的ViewModel的实例。然后,从那里,您可以绑定到ViewModel上的属性,包括ICommand。您可以使用RelayCommand(请参阅上面的链接)或使用框架提供的命令(例如,Prism提供DelegateCommand)。这些命令采用Action(执行)和Func(CanExecute)。只需在CanExecute中提供逻辑。当然,您还必须将ListView SelectedItem(或SelectedValue)数据绑定到ViewModel上的属性,以便在CanExecute函数中检查它是否为null。

假设您使用RelayCommand,则无需明确调用RaiseCanExecuteChanged的{​​{1}}。

ICommand