2013-01-23 35 views
6

Tôi có một ComboBox với DataContext được xác định tại ứng dụng bắt đầu với ViewModel thích hợp. Tôi muốn lấy các mục từ một tệp XML nhưng có các lựa chọn người dùng liên kết với ViewModel và cuối cùng là mô hình.MVVM DataBinding

XAML:

<ComboBox x:Name="cbConnection" 
      ItemsSource="{Binding Source={StaticResource XmlConnectionList}, XPath=//ComboItem}" 
      DisplayMemberPath="Key" 
      SelectedValuePath="Value" 
      SelectionChanged="{Binding Path=DataContext.cbConnection_SelectionChanged}" 
      /> 

nhưng tôi nhận được ngoại lệ sau khi chạy:

{"Unable to cast object of type 'System.Reflection.RuntimeEventInfo' to type 'System.Reflection.MethodInfo'."}

Chúng ta biết ViewModel được một cách thích hợp thiết lập như DataContext của Window của View. Tôi đang làm gì sai?

+0

Hey Sammarcow ... Làm thế nào đã làm bạn nhận được trên? Nó có hoạt động không? – PGallagher

Trả lời

13

Bạn đang sử dụng;

SelectionChanged="{Binding Path=DataContext.cbConnection_SelectionChanged}" 

Sự kiện thực sự là sự kiện.

Bạn nên ràng buộc Thuộc tính công khai (có thể triển khai INotifyPropertyChanged) trong ViewModel của mình thành SelectedItem Thuộc tính để quản lý các thay đổi đối với Lựa chọn.

Giả sử rằng cửa sổ của bạn có DataContext, chứ không phải là combobox chính nó ...

SelectedItem Binding Version:

Vì vậy, XAML của bạn sẽ là một cái gì đó tương tự;

<ComboBox x:Name="cbConnection" 
      ItemsSource="{Binding Source={StaticResource XmlConnectionList}, XPath=//ComboItem}" 
      DisplayMemberPath="Key" 
      SelectedValuePath="Value" 
      SelectedItem="{Binding Path=DataContext.cbConnectionSelectedItem}" 
/> 

Và trong ViewModel của bạn;

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 

chữ Version Binding:

Tất nhiên, nếu tất cả các bạn quan tâm đến là các văn bản giá trị của những gì họ đã chọn, bạn có thể về mặt lý thuyết chỉ ràng buộc các ComboBox chữ tài sản vào một String Công Thuộc tính trong ViewModel của bạn;

XAML của bạn sẽ là;

<ComboBox x:Name="cbConnection" 
       ItemsSource="{Binding Source={StaticResource XmlConnectionList}, XPath=//ComboItem}" 
       DisplayMemberPath="Key" 
       SelectedValuePath="Value" 
       Text="{Binding Path=DataContext.cbConnectionText}" 
    /> 

Và ViewModel của bạn;

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 

SelectedValue Binding Version:

Nếu bạn đang hiển thị các Key, nhưng muốn giá trị từ Key/Value Pair, thì bạn nên liên kết với SelectedValue;

XAML;

<ComboBox x:Name="cbConnection" 
    ItemsSource="{Binding Source={StaticResource XmlConnectionList}, XPath=//ComboItem}" 
    DisplayMemberPath="@Key" 
    SelectedValuePath="@Value" 
    SelectedValue="{Binding Path=DataContext.cbConnectionValue}" /> 

ViewModel;

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 

Lưu ý thêm các biểu tượng @.

Như tôi đã đề cập ở trên, điều này giả định rằng Cửa sổ của bạn có tập dữ liệu DataContext tại đây. Nếu không, sau đó loại bỏ các "DataContext." Của từ Bindings ở trên!

Tôi cho rằng bạn hiện đang thấy các mục được liệt kê trong ComboBox của mình?

Hy vọng điều này sẽ hữu ích!

+0

Ràng buộc với SelectedIndex sẽ yêu cầu tham chiếu khác đến nguồn dữ liệu XML trong ViewModel để xác định Giá trị được liên kết với DisplayMEmeber, phải không? Khác tôi sẽ chỉ biết SelectedIndex vì ComboBox được điền từ một nguồn dữ liệu bên ngoài. – sammarcow

+0

Xin lỗi, tôi nhanh chóng nhận thấy rằng tôi có nghĩa là Mục đã chọn ... – PGallagher

+0

Hm, tôi không chắc mình đang làm gì sai, nhưng '' dường như không kích hoạt thuộc tính getter hoặc setter ConnectionString trong ViewModel của tôi. – sammarcow

7

bạn phải sử dụng sự kiện Gây nên cho ComboBox Selection thay đổi tổ chức sự kiện Bạn nên cố gắng mã dưới đây đề cập đến

<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> 

cho các bạn có thêm tài liệu tham khảo như

xmlns:l="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
+0

Tôi chưa thử nghiệm điều này, nhưng câu trả lời được chấp nhận dường như có hiệu quả đạt được kết quả tương tự. – sammarcow