MVVM 数据绑定



我有一个组合框,其中在应用程序启动时定义了相应的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" 

相关内容

  • 没有找到相关文章

最新更新