我有一个组合框,其中在应用程序启动时定义了相应的ViewModel的DataContext。 我想从 XML 文件中获取项目,但让用户选择绑定到 ViewModel,并最终绑定到模型。
XAML:
<ComboBox x:Name="cbConnection"
ItemsSource="{Binding Source={StaticResource XmlConnectionList}, XPath=//ComboItem}"
DisplayMemberPath="Key"
SelectedValuePath="Value"
SelectionChanged="{Binding Path=DataContext.cbConnection_SelectionChanged}"
/>
但我在运行时收到以下异常:
{"Unable to cast object of type 'System.Reflection.RuntimeEventInfo' to type 'System.Reflection.MethodInfo'."}
我们知道 ViewModel 被恰当地设置为视图窗口的 DataContext。 我做错了什么?
您正在使用;
SelectionChanged="{Binding Path=DataContext.cbConnection_SelectionChanged}"
这实际上是一个事件。
您应该将视图模型中的公共属性(可能实现 INotifyPropertyChanged)绑定到 SelectedItem 属性,以管理所选内容的更改。
假设您的窗口具有数据上下文,而不是组合框本身...
选定项绑定版本:
因此,您的 XAML 将类似于;
<ComboBox x:Name="cbConnection"
ItemsSource="{Binding Source={StaticResource XmlConnectionList}, XPath=//ComboItem}"
DisplayMemberPath="Key"
SelectedValuePath="Value"
SelectedItem="{Binding Path=DataContext.cbConnectionSelectedItem}"
/>
并在您的视图模型中;
Private _cbConnectionSelectedItem As XmlElement
Public Property cbConnectionSelectedItem As XmlElement
Get
Return _cbConnectionSelectedItem
End Get
Set(value As XmlElement)
If value.Equals(_cbConnectionSelectedItem) = False Then
_cbConnectionSelectedItem = value
OnPropertyChanged("cbConnectionSelectedItem")
End If
End Set
End Property
文本绑定版本:
当然,如果您只关心他们选择的文本值,理论上您只需将 ComboBox 文本属性绑定到 ViewModel 中的公共字符串属性即可;
然后,你的 XAML 将是;
<ComboBox x:Name="cbConnection"
ItemsSource="{Binding Source={StaticResource XmlConnectionList}, XPath=//ComboItem}"
DisplayMemberPath="Key"
SelectedValuePath="Value"
Text="{Binding Path=DataContext.cbConnectionText}"
/>
和您的视图模型;
Private _cbConnectionText As String
Public Property cbConnectionText As String
Get
Return _cbConnectionText
End Get
Set(value As String)
If value.Equals(_cbConnectionText) = False Then
_cbConnectionText = value
OnPropertyChanged("cbConnectionText")
End If
End Set
End Property
选定值绑定版本:
如果要显示键,但需要键/值对中的值,则应绑定到选定值;
XAML;
<ComboBox x:Name="cbConnection"
ItemsSource="{Binding Source={StaticResource XmlConnectionList}, XPath=//ComboItem}"
DisplayMemberPath="@Key"
SelectedValuePath="@Value"
SelectedValue="{Binding Path=DataContext.cbConnectionValue}" />
视图模型;
Private _cbConnectionValue As String
Public Property cbConnectionValue As String
Get
Return _cbConnectionValue
End Get
Set(value As String)
If value.Equals(_cbConnectionText) = False Then
_cbConnectionValue = value
OnPropertyChanged("cbConnectionValue")
End If
End Set
End Property
请注意额外的 @ 符号。
正如我上面提到的,这假设你的窗口在这里设置了数据上下文。如果没有,请删除"数据上下文"。来自上面的绑定!
我假设您当前看到组合框中列出的项目?
希望这有帮助!
你必须使用事件 组合框选择的触发器已更改 事件您应该尝试以下提及代码
<ComboBox Margin="192,5,5,5" DisplayMemberPath="AttachmentName" ItemsSource="{Binding AttachementList, Mode=TwoWay}" Style="{StaticResource BasicComboBoxStyle}" BorderThickness="2" BorderBrush="DarkGray"
Name="cmb_AttchDetails" Width="287" Height="25" SelectedItem="{Binding Defaultrequiredattachment, Mode=TwoWay}">
<l:Interaction.Triggers>
<l:EventTrigger EventName="SelectionChanged">
<l:InvokeCommandAction Command="{Binding DataContext.AttachmentNameCommand,Mode=TwoWay,RelativeSource={RelativeSource AncestorType=controls:ChildWindow}}" CommandParameter="{Binding ElementName=cmb_AttchDetails,Path=SelectedItem}" />
</l:EventTrigger>
</l:Interaction.Triggers>
</ComboBox>
对于这些,您必须添加引用,例如
xmlns:l="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"