【问题标题】:Combobox selection change in XAMLXAML 中的组合框选择更改
【发布时间】:2013-06-09 14:37:35
【问题描述】:

我的UserControl 中有一个Combobox 和两个按钮。是否可以设置这些按钮以直接在 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) 之类的东西

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

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

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

    【讨论】:

    • 优雅。聪明的。构思不错!
    【解决方案2】:

    对于复选框问题,它属于将数量转换为布尔值的一般问题。规范的 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 文档。 Here 您可以在 ViewModel 中操作它来移动当前选择。并且有大量的示例代码需要检查。了解 ICollectionView 将为您作为 WPF 开发人员提供良好的服务。

    【讨论】:

    • +1。虽然我更喜欢保持简单。另外,我宁愿从MarkupExtension 继承我的所有转换器,从而无需将它们实例化为资源。
    • 关于从 MarkupExtension 继承的非常有价值的提示。哇哦!这就是我改变我的转换器库的声音!
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多