我在工具栏中有一个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
以避免该错误,但该修复显然无法正常工作。
答案 0 :(得分:0)
这不是一个错误。 Xceed确认SelectedItem不会返回您通常期望的内容,即ComboBox中选择的最新项目。相反,它始终返回第一个已检查的项目,无论选中还是未选中 ....&#34;按设计&#34;。