3

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

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

IsEnabled="{Binding myList.SelectedIndex}"

但这似乎不起作用。

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

谢谢

4

3 回答 3

6

你需要一个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 的名称空间匹配的名称。

于 2010-06-01T20:55:36.487 回答
2

复制粘贴解决方案:

将此类添加到您的代码中:

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}"/>
于 2016-08-27T11:56:11.163 回答
0

嗯,也许它可以与 BindingConverter 一起使用,它将所有 > 0 的索引显式转换为 true。

于 2010-06-01T20:52:14.453 回答