XAML中的组合框选择更改

本文关键字:选择 组合 XAML | 更新日期: 2023-09-27 18:17:29

我有一个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)

XAML中的组合框选择更改

)

我宁愿将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");
}

对于复选框问题,它属于将数量转换为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>

对于组合框SelectedIndex问题,您可以查看CollectionViewSource文档。在这里,你可以在ViewModel中操作它来移动当前选择。并且有大量的示例代码需要检查。了解ICollectionView将为WPF开发人员提供良好的服务。