我有一个包含2列的网格,第0列中的列表框以及主网格列1中辅助网格中的许多其他控件。
如果通过绑定在列表框中选择了某个项目,我希望此控件仅启用(或可能是可见的)。我尝试了一个组合框:
IsEnabled="{Binding myList.SelectedIndex}"
但这似乎不起作用。
我错过了什么吗?应该这样的工作吗?
感谢
答案 0 :(得分:5)
你需要一个ValueConverter
。 This article详细描述了它,但总结是你需要一个实现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并检查非null,但这只是偏好。
哦,如果您不熟悉备用xmlns
声明,请在Window
的顶部添加
xmlns:local=
和VS将提示您各种可能性。您需要找到与您放置的valueconverter所在的命名空间匹配的那个。
答案 1 :(得分:0)
嗯,也许它适用于BindingConverter,它明确地转换所有索引&gt; 0到真。
答案 2 :(得分:0)
复制 - 粘贴解决方案:
将此类添加到您的代码中:
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添加到<Application.Resources>
部分中的App.xml:
<local:HasSelectedItemConverter x:Key="HasSelectedItemConverter" />
现在你可以在你的XAML中使用它了:
<Button IsEnabled="{Binding ElementName=listView1, Path=SelectedIndex,
Converter={StaticResource HasSelectedItemConverter}"/>