XAML中的组合框选择更改

时间:2013-06-09 14:37:35

标签: c# wpf xaml

我的Combobox中有一个UserControl和两个按钮。是否可以将这些按钮设置为直接在XAML中更改Combobox的所选索引?

我通过两种方法做到了这一点:

代码隐藏

 private void nextBut_Click(object sender, RoutedEventArgs e)
        {
            combo.SelectedIndex++;
        }

        private void prevBut_Click(object sender, RoutedEventArgs e)
        {

            combo.SelectedIndex--;
        }

或者通过将命令绑定到这些按钮并在我的ModelView中定义该命令。

我还有另一个关于XAML的问题,我真的不知道是不是问了一个问题,或者利用这个机会你已经在读我了!我敢肯定它必须是直截了当的(至少对于这里的WPF大师):

我有ItemsControl持有UserControl,但可能有几个或没有(因为你可以创建更多,或删除)。我希望Checkbox外部启用或不启用取决于我ItemsContol中是否有元素(如果没有则禁用)。我认为这可以通过命令验证完成,但对我来说很难,因为我是这个世界的新手。这也可以通过代码隐藏完成,但我想避免它。 (比如定义绑定到Checkbox的bool属性,就像写if(myItems.Count==0)

一样

2 个答案:

答案 0 :(得分:2)

对于复选框问题,它涉及将数量转换为bool的一般问题。规范的WPF答案将复选框IsChecked属性绑定到集合并通过IValueConverter路由它。这是一个转换器就可以做到......

public class QuantityToBoolConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                    System.Globalization.CultureInfo culture)
    {
        try
        {
            IEnumerable items = value as IEnumerable;
            if (items != null)
            {
                return items.OfType<object>().Any();
            }
        }
        catch
        {
            return value;
        }
    }
    public object ConvertBack(object value, Type targetType, object parameter, 
                        System.Globalization.CultureInfo culture)
    {
        return null;
    }
}

要部署它,您需要在Xaml中将其声明为资源...

<Window.Resources>
    <converters:QuantityToBoolConverter x:Key="QuantityToBoolConverter"/>
</Window.Resources>

然后将IsChecked属性绑定到您的项目并声明转换器...

<ListBox Name="mylb">
</ListBox>
<CheckBox IsChecked="{Binding ElementName=mylb, Path=ItemsSource, Converter={StaticResource 
                  QuantityToBoolConverter}}"></CheckBox>

对于combobox SelectedIndex问题,您可以查看CollectionViewSource文档。 Here您可以在ViewModel中对此进行操作以移动当前选择。还有大量的示例代码需要检查。了解ICollectionView将很好地为您提供WPF开发人员。

答案 1 :(得分:2)

我宁愿将SelectedItem属性绑定到ViewModel中的某个属性,并将这些按钮绑定到ViewModel中的某些命令。这种方式将状态数据(selectedItem)保存在ViewModel中,并可以使用它来执行所需的任何其他逻辑,从而消除了对代码的需求。

对于CheckBox,我宁愿在ViewModel中放置一个bool属性,并在添加/删除项目时通知它。

public bool HasItems {get {return Items.Any(); } }

public void AddItem()
{
    //...Add Items
    NotifyPropertyChanged("HasItems");
}

public void RemoveItem()
{
    //...Remove Item
    NotifyPropertyChanged("HasItems");
}

这消除了对额外转换器的需求。