如果列表框具有选择项,WPF会在其他控件上绑定IsEnabled

时间:2010-06-01 20:30:04

标签: wpf data-binding isenabled

我有一个包含2列的网格,第0列中的列表框以及主网格列1中辅助网格中的许多其他控件。

如果通过绑定在列表框中选择了某个项目,我希望此控件仅启用(或可能是可见的)。我尝试了一个组合框:

IsEnabled="{Binding myList.SelectedIndex}"

但这似乎不起作用。

我错过了什么吗?应该这样的工作吗?

感谢

3 个答案:

答案 0 :(得分:5)

你需要一个ValueConverterThis 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}"/>