我有一个有 2 列的网格,第 0 列中有一个列表框,主网格第 1 列的辅助网格中有许多其他控件。
如果通过绑定在列表框中选择了项目,我希望仅启用(或可能可见)此控件。我试过一个组合框:
IsEnabled="{Binding myList.SelectedIndex}"
但这似乎不起作用。
我错过了什么吗?像这样的东西应该工作吗?
谢谢
我有一个有 2 列的网格,第 0 列中有一个列表框,主网格第 1 列的辅助网格中有许多其他控件。
如果通过绑定在列表框中选择了项目,我希望仅启用(或可能可见)此控件。我试过一个组合框:
IsEnabled="{Binding myList.SelectedIndex}"
但这似乎不起作用。
我错过了什么吗?像这样的东西应该工作吗?
谢谢
你需要一个ValueConverter
。本文详细介绍了它,但总结是你需要一个实现 IValueConverter 的公共类。在 Convert() 方法中,您可以执行以下操作:
if(!(value is int)) return false;
if(value == -1) return false;
return true;
现在,在您的 XAML 中,您需要执行以下操作:
<Window.Resources>
<local:YourValueConverter x:Key="MyValueConverter">
</Window.Resources>
最后,将您的绑定修改为:
IsEnabled="{Binding myList.SelectedIndex, Converter={StaticResource MyValueConverter}"
你确定你不是那个意思
IsEnabled="{Binding ElementName=myList, Path=SelectedIndex, Converter={StaticResource MyValueConverter}"
尽管?您不能隐式地将元素的名称放在路径中(除非它Window
本身是DataContext
,我猜)。绑定到 SelectedItem 并检查 not null 也可能更容易,但这实际上只是偏好。
哦,如果您不熟悉备用xmlns
声明,请在您的顶部Window
添加
xmlns:local=
VS 会提示您提供各种可能性。您需要找到与您放入 valueconverter 的名称空间匹配的名称。
复制粘贴解决方案:
将此类添加到您的代码中:
public class HasSelectedItemConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value is int && ((int) value != -1);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
将转换器作为 StaticResource 添加到 App.xml<Application.Resources>
部分:
<local:HasSelectedItemConverter x:Key="HasSelectedItemConverter" />
现在您可以在 XAML 中使用它:
<Button IsEnabled="{Binding ElementName=listView1, Path=SelectedIndex,
Converter={StaticResource HasSelectedItemConverter}"/>
嗯,也许它可以与 BindingConverter 一起使用,它将所有 > 0 的索引显式转换为 true。