【问题标题】:Populate WPF combo box items in XAML style based on the state of another control根据另一个控件的状态以 XAML 样式填充 WPF 组合框项
【发布时间】:2015-04-29 06:37:36
【问题描述】:

我想我已经接近了,但我在这里遗漏了一些东西。
我真的在努力扩展我的 XAML 知识,并在我的 WPF 项目中整理我的代码。
我有一种情况,我想根据另一个控件的状态填充组合框的项目。

我有一种检查复选框值的样式:

    <Style 
        x:Key="{x:Type ComboBox}" 
        TargetType="{x:Type ComboBox}">
        <Style.Triggers>
            <DataTrigger
                Binding="{Binding ElementName=SomeCheckBox, Path=IsChecked}"
                Value="True">

这似乎让我可以触发框的值。
我现在正试图弄清楚如何设置我的二传手。
似乎没有办法访问 items 属性...
这是我一直在搞砸的:

                <Setter
                    Property="Items">
                    <Setter.Value>
                        <ComboBoxItem Content="SomeValue" />
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>

但很明显这是行不通的。
有没有办法使用 setter 来做到这一点?
我是否需要提出某种列表或列表,将它们存放在窗口资源中并用作项目源?
我该如何列出这份清单?

【问题讨论】:

  • 试试 ItemsSource 而不是 Items。
  • 我可以使用 ItemsSource,但我仍然需要在 XAML 中提供一个 IEnumerable 才能进行设置。
  • 您尝试使用固定列表填充 ComboBox 的列表是否会随时间而变化?
  • 已修复。我基本上有两个不同的组合框选项列表,当复选框的状态从选中变为未选中时,它们应该被切换进/出。

标签: c# wpf xaml combobox


【解决方案1】:

基于另一个控件的状态

在将复选框IsChecked 绑定到属性后,我将在VM 后面的代码中执行此操作,同时还将ComboBox 绑定到根据IsChecked 的值更改的列表。

这是一个简单的例子:

 public bool IsOperationChecked // Bound to the checkbox
 {                       
     get { return _IsOperationChecked; }
     set { 
            _IsOperationChecked= value; 
            OnPropertyChanged("IsOperationChecked"); 
            Names = (value) ? new List<string>() {"alpha", "beta"} : 
                              new List<string>() {"Bill", "Frank"};
         }
  }

 public List<string> Names // Bound to the Combobox
 {
    get { return _Names; }
    set { _Names = value; OnPropertyChanged("Names"); }
 }

【讨论】:

  • 我试图避免在后面的代码中这样做。您所描述的绝对是一种方法,但我试图挑战自己以找出一种通过 XAML 实现它的方法。我大部分时间都在那里,我只需要以某种方式在 XAML 中创建列表。
【解决方案2】:

使用资源中声明的数组:

<Window.Resources>

    <x:Array Type="sys:String" 
             xmlns:sys="clr-namespace:System;assembly=mscorlib" 
             x:Key="MyArray">
        <sys:String>One</sys:String>
        <sys:String>Two</sys:String>
    </x:Array>

</Window.Resources>

...

<Style x:Key="{x:Type ComboBox}" 
       TargetType="{x:Type ComboBox}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=SomeCheckBox, Path=IsChecked}" Value="True">
            <Setter Property="ItemsSource" Value="{StaticResource MyArray}" />
        </DataTrigger>
    </Style.Triggers>
</Style>

【讨论】:

  • 美丽。绝对完美。我在其他地方看到过提到的数组,但是 XAML 的智能感知不想让我这样做,所以我认为我做错了什么或者由于某种原因它不是一个选项,但我强迫它通过并且一切都很好.感谢您帮助我完成 XAML 游戏!
猜你喜欢
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2021-05-31
相关资源
最近更新 更多