2013-03-25 46 views
11

Tôi muốn bind một loạt của textbox trong một mạng lưới thành thuộc tính của một đối tượng mà là chính nó một tài sản trong ViewModel của tôi (DataContext).liên kết với một tài sản của một đối tượng

CurrentPerson gồm NameAge tính

Bên trong ViewModel:

public Person CurrentPerson { get; set ... (with OnPropertyChanged)} 

XAML:

<TextBox Text="{Binding Name}" > 
<TextBox Text="{Binding Age}" > 

Tôi đã không chắc chắn về cách tiếp cận để sử dụng, tôi đặt một DataContext khác trong phạm vi lưới, mà không có bất kỳ kết quả nào, cũng đã thử s đặt nguồn và đường dẫn như Source = CurrentPerson, Path = Age một lần nữa mà không có bất kỳ kết quả nào, chúng là để thử và xem liệu có thay đổi hay không.

Tôi nên đạt được điều này như thế nào?

Trả lời

17

Bạn có Person thành viên của lớp NameAge tự nâng cấp INPC không?

Nếu bạn muốn cập nhật giá trị của một trong hai Name hoặc Age trong ViewModel và có nó phản ánh trong giao diện, bạn cần đến chúng để nâng cao tài sản thay đổi riêng bên Person lớp là tốt.

Các kết buộc là tốt nhưng chế độ xem không được thông báo nhiều về các thay đổi từ mô hình chế độ xem. Ngoài ra, hãy nhớ UpdateSourceTrigger cho một số TextBox theo mặc định là LostFocus, Đặt thành PropertyChanged sẽ cập nhật chuỗi của bạn trong số ViewModel làm cách nhập của bạn.

đơn giản ví dụ:

public class Person : INotifyPropertyChanged { 
    private string _name; 
    public string Name { 
    get { 
     return _name; 
    } 

    set { 
     if (value == _name) 
     return; 

     _name = value; 
     OnPropertyChanged(() => Name); 
    } 
    } 

    // Similarly for Age ... 
} 

Bây giờ XAML của bạn sẽ là:

<StackPanel DataContext="{Binding CurrentPerson}"> 
    <TextBox Text="{Binding Name}" /> 
    <TextBox Margin="15" 
      Text="{Binding Age}" /> 
</StackPanel> 

hoặc bạn cũng có thể liên kết theo đề nghị của @Kshitij

<StackPanel> 
    <TextBox Text="{Binding CurrentPerson.Name}" /> 
    <TextBox Margin="15" 
      Text="{Binding CurrentPerson.Age}" /> 
</StackPanel> 

và để cập nhật xem mô hình như đánh máy của bạn

<StackPanel DataContext="{Binding CurrentPerson}"> 
    <TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBox Margin="15" 
      Text="{Binding Age, UpdateSourceTrigger=PropertyChanged}" /> 
</StackPanel> 
+0

Có điểm, cảm ơn – LastBye

12

Hãy thử điều này:

<TextBox Text="{Binding CurrentPerson.Name}" /> 
<TextBox Text="{Binding CurrentPerson.Age}" /> 

Về cơ bản, bạn có thể đi sâu vào các thuộc tính bằng cách sử dụng các . tách.

Để tham khảo sau này, nếu bạn muốn xem chi tiết các bộ sưu tập, bạn có thể sử dụng MyCollection[x] giống như bạn viết mã (trong đó x sẽ được thay thế bằng mã số cứng, không phải là biến).

+0

+1 và cảm ơn thông tin, không chắc chắn rằng trong phần Xaml tôi có thể sử dụng điều này, nhưng tôi nghĩ rằng tôi đã cố gắng theo cách này quá.Một lần nữa đã thực hiện phương pháp này mà không có kết quả, CurrentPerson đã định nghĩa và kích hoạt NotifyPropertyChanged nhưng có thể có một cái gì đó bị thiếu. – LastBye

+0

Dường như việc thay đổi thông báo sẽ không thực hiện hành động theo cách này. Có đúng không? làm thế nào tôi nên sửa lỗi này? – LastBye

+0

Chưa hiệu quả với tôi. không biết tại sao ... – LastBye

Các vấn đề liên quan