Xceed CheckComboBox不重新调整预期值

时间:2017-12-22 06:08:03

标签: wpf vb.net combobox xceed

我在工具栏中有一个CheckComboBox,定义如下:

<xctk:CheckComboBox
    x:Name="cboColumns"
    Width="75"
    Command="{x:Static self:CustomCommands.ChangeColumn}"
    DisplayMemberPath="Header"
    ValueMemberPath="Header"
    SelectedMemberPath="Visibility"
    IsEditable="False">                 
</xctk:CheckComboBox>

ItemsSource设置如下:

Dim ColList As New ObservableCollection(Of MemberColumn)
With ColList
    .Add(New MemberColumn With {.Header = "Last Name", .Visibility = True})
    .Add(New MemberColumn With {.Header = "First Name", .Visibility = True})
    .Add(New MemberColumn With {.Header = "Middle Name", .Visibility = False})
    <numerous additional items>
End With
cboColumns.ItemsSource = ColList

其中MemberColumn是Class,只有两个属性:

Public Property Header As String
Public Property Visibility As Boolean

出于调试目的,我将ChangeColumn命令定义为:

Private Sub ChangeColumn(sender As Object, e As ExecutedRoutedEventArgs)
    Debug.WriteLine(DirectCast(cboColumns.SelectedItem, MemberColumn).Header)
End Sub

我希望debug语句能够编写SelectedItem的Header,但它总是只写&#34; Last Name&#34;无论我检查/取消选中列表中的哪个项目。

这是一个错误还是我做错了什么?

修改1

我想我刚刚提出了XY问题,所以让我解释一下我想要做什么,以便我们能够处理真正的问题。

我有一个包含大量列的数据网格,我想让用户能够选择在网格中显示哪些列。为此,我在工具栏中有一个CheckComboBox(x:Name = cboColumns),列出了网格中的所有列。我们的想法是,只有在ComboBox中检查的列才会在网格中可见。

以下是我尝试绑定每个列的Visibility属性的方法:

Visibility="{Binding ElementName=cboColumns, Path=SelectedValue}"

但是这会引发错误:System.Windows.Data错误:2:无法找到目标元素的管理FrameworkElement或FrameworkContentElement。

我认为问题在于ComboBox不在网格列的名称范围内,所以绑定不能看到&#34;&#34;它。如果是这样,怎么办?

修改2

我认为我通过将绑定更改为:

来解决了名称范围问题
Visibility="{Binding Source={x:Reference cboColumns}, Path=SelectedValue}"

但是引发了这个错误:

&#39; TargetDefaultValueConverter&#39;转换器未能转换值&#39;&#39;

请注意,我将Visibility属性更改为:

Public Property Visibility As Visibility

以避免该错误,但该修复显然无法正常工作。

1 个答案:

答案 0 :(得分:0)

这不是一个错误。 Xceed确认SelectedItem不会返回您通常期望的内容,即ComboBox中选择的最新项目。相反,它始终返回第一个已检查的项目,无论选中还是未选中 ....&#34;按设计&#34;。