我有一个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}”。
答案 0 :(得分:21)
这里有一些问题。
Precedence,如果您在控件本身设置IsEnabled
,则样式将永远无法更改它。
ElementName,它是ElementName
,不是路径,只是一个字符串,它给出了一个元素的名称。除此之外的所有内容都会进入Path。
样式语法,如果设置Style.TargetType
,则不应将Setter.Property
设置为类型前缀(尽管不会破坏设置器)。
顺便说一下,这就足够了:
<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