设置button'sproperty IsEnabled是否基于列表框中的内容与Silverlight中的BoolConverter?

时间:2011-03-08 06:29:35

标签: silverlight binding

我正在尝试仅在列表框中至少包含一个项目时才启用按钮。我通过从AutoCompleteBox列表中选择它们来添加listboxitems。我尝试将isEnabled属性绑定到列表框,并使用BoolConverter验证列表框是否包含内容。

<Button x:Name="DisabledButton" Click="RemoveButton_Click" Content="Disabled Button" IsEnabled="{Binding ItemsSource, ElementName=EntitiesListBox,Converter={StaticResource CountToBooleanConverter}}"  />

我错过了什么。我想知道是否有人可以告诉我有什么问题。任何想法都非常感谢!

Silverlight XAML:

<UserControl.Resources>
    <local:BoolToOppositeBoolConverter x:Key="CountToBooleanConverter" />
    <local:CountGreaterThanZeroConverter x:Key="CountGreaterThanZeroConverter" />
</UserControl.Resources>

<StackPanel x:Name="LayoutRoot" Background="White" Width="150">
    <TextBlock Text="{Binding ElementName=MyAutoCompleteBox, Path=SelectedItem, TargetNullValue='No item selected', StringFormat='Selected Item: {0}'}" />      
    <sdk:AutoCompleteBox x:Name="MyAutoCompleteBox" IsTextCompletionEnabled="True" ItemsSource="{Binding Items}" />
    <Button x:Name="AddButton" Click="AddButton_Click" Content="AddButton" />
    <Button x:Name="RemoveButton" Click="RemoveButton_Click" Content="RemoveButton" />
    <Button x:Name="DisabledButton" Click="RemoveButton_Click" Content="Disabled Button" IsEnabled="{Binding ItemsSource, ElementName=ListBox,Converter={StaticResource CountToBooleanConverter}}"  />
    <Button x:Name="DisabledButton2" Click="RemoveButton_Click" Content="Disabled Button"  IsEnabled="{Binding ItemsSource.Count, ElementName=ListBox, Converter={StaticResource CountGreaterThanZeroConverter}}" />
</StackPanel>

代码背后:

public partial class MainPage : UserControl
{
    string currentItemText;
    public ObservableCollection<string> Items
    {
        get;
        private set;
    }

    public MainPage()
    {
        InitializeComponent();
        Items = new ObservableCollection<string>();
        Items.Add("One");
        Items.Add("Two");
        Items.Add("Three");
        Items.Add("Four");
        DataContext = this;
    }

    private void AddButton_Click(object sender, RoutedEventArgs e)
    {
        currentItemText = MyAutoCompleteBox.SelectedItem.ToString();
        ListBox.Items.Add(currentItemText);
        ApplyDataBinding();
    }
    private void RemoveButton_Click(object sender, RoutedEventArgs e)
    {
        if (ListBox.SelectedItems != null)
        {
            int count = ListBox.SelectedItems.Count - 1;
            for (int i = count; i >= 0; i--)
            {
                ListBox.Items.Remove(ListBox.SelectedItems[i]);
            }
            ApplyDataBinding();
        }
    }

    private void ApplyDataBinding()
    {
        MyAutoCompleteBox.ItemsSource = null;
    }
}

public class CountGreaterThanZeroConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
            return (int)value > 0;  
    }


    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotSupportedException();
    }

    #endregion
    }

1 个答案:

答案 0 :(得分:1)

为什么不绑定到itemssource的计数并使用可观察的集合?

 <Button x:Name="DisabledButton" Click="RemoveButton_Click" Content="Disabled Button" IsEnabled="{Binding ItemsSource.Count, ElementName=ListBox,Converter={StaticResource CountGreaterThanZeroConverter}}"  />


    public object Convert(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        return (int)value > 0;
    }

在你的viewmodel中

    public ObservableCollection<string> Items
    {
        get;
        private set;
    }