2015-05-20 14 views
7

Như MSDN nói:Tại sao loại ràng buộc này có hành vi lạ?

tùy ý, một giai đoạn đường có thể được sử dụng để liên kết với nguồn hiện tại (.). Ví dụ: Văn bản = "{Binding}" tương đương với Văn bản = "{Binding Đường dẫn =.}".

Nhưng trong hai ví dụ dưới đây tôi phải đối mặt với hành vi khác nhau:

Đầu tiên:

<StackPanel> 
    <TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/> 
    <Grid DataContext="{Binding Path=MyString}"> 
     <TextBox Text="{Binding}"></TextBox> 
    </Grid> 
    </StackPanel> 

ví dụ này tăng ngoại lệ với thông điệp:

"hai chiều ràng buộc đòi hỏi Đường dẫn hoặc XPath. "

Thứ hai:

<StackPanel> 
    <TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/> 
    <Grid DataContext="{Binding Path=MyString}"> 
     <TextBox Text="{Binding Path=.}"></TextBox> 
    </Grid> 
    </StackPanel> 

Và ví dụ này chạy đúng và lần đầu tiên thay đổi văn bản TextBox phản ánh để ViewModel và nội dung của TextBox đầu tiên thay đổi quá nhưng khi văn bản TextBox thứ hai thay đổi mà không được phản ánh để ViewModel (hoặc đầu tiên Hộp văn bản)!

Câu hỏi: Tôi đánh giá cao bất kỳ ai giải thích về hai trường hợp này?

Chú ý: DataContext của phụ huynh kiểm soát (như cửa sổ) là một lớp đơn giản với một tài sản phải khai báo MyString:

Cảm ơn.

+1

Chỉnh sửa văn bản trong TextBox * thứ hai thay thế * trường hợp chuỗi trong DataContext của TextBox. Nó không cập nhật bất kỳ thuộc tính nào. – Clemens

+0

@Clemens, "thể hiện chuỗi trong DataContext" là MyString, vậy tại sao điều này không được cập nhật? –

+0

Đối với lỗi liên kết trong một trường hợp nhưng không phải là lỗi khác: thuộc tính Văn bản liên kết hai chiều theo mặc định và rõ ràng lớp Binding kiểm tra xem thuộc tính Đường dẫn có được đặt khi đó là hai chiều hay không. Tuy nhiên, có vẻ như nó không kiểm tra nếu Path biểu thị một thuộc tính hoặc chỉ chính đối tượng nguồn. – Clemens

Trả lời

0

có vẻ như bất cứ khi nào có hai cách ràng buộc {Binding Path =.} Là bắt buộc. hãy thử thay đổi mã là:

<StackPanel> 
      <TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/> 
      <Grid DataContext="{Binding Path=MyString}"> 
       <!--<TextBox Text="{Binding}"></TextBox>--> 
       <Label Content="{Binding}"/> 
      </Grid> 
     </StackPanel> 

và nó hoạt động tốt. Trên mã ban đầu trên cách ràng buộc cũng hoạt động.

đây là một chủ đề liên quan:

Are "{Binding Path=.}" and "{Binding}" really equal