2009-05-20 26 views
6

Tôi có một cửa sổ WPF có chứa một TextBox. Tôi đã thực hiện một Lệnh thực hiện trên Crtl-S để lưu nội dung của cửa sổ. Vấn đề của tôi là nếu hộp văn bản là điều khiển hoạt động, và tôi có văn bản mới được chỉnh sửa trong hộp văn bản, những thay đổi mới nhất trong hộp văn bản không được cam kết. Tôi cần phải ra khỏi hộp văn bản để có được những thay đổi.EndEdit tương đương trong WPF

Trong WinForms, tôi thường gọi EndEdit trên biểu mẫu và tất cả thay đổi đang chờ xử lý sẽ được cam kết. Một lựa chọn khác là sử dụng ràng buộc onPropertyChange thay vì onValidation, nhưng tôi không muốn làm điều này.

WPF tương đương với EndEdit là gì hoặc mẫu sử dụng trong loại kịch bản này là gì?

Cảm ơn,

Trả lời

4

Để tránh sự cố cần phải thoát tab, bạn có thể chỉ cần thay đổi thuộc tính UpdateSourceTrigger của liên kết điều khiển của bạn. Hãy thử các cách sau:

<TextBox.Text> 
    <Binding Path="MyProperty" UpdateSourceTrigger="PropertyChanged"/> 
</TextBox.Text> 

Điều này yêu cầu WPF cập nhật đối tượng sao lưu bất cứ khi nào thuộc tính Văn bản bị thay đổi. Bằng cách này, bạn không cần phải lo lắng về tabbing đi. Hi vọng điêu nay co ich!

EDIT:

Câu trả lời được chấp nhận cho những câu dưới đây SO cung cấp một cách để tự động chạy quy tắc xác nhận cho một trang. Bạn có thể sửa đổi nó để gọi UpdateSource() trên tất cả các đối tượng BindingExpression thay thế.

Link

+0

Tôi không nên thêm bản cập nhậtSourceTrigger vào tất cả các hộp văn bản trong biểu mẫu của tôi, một cuộc gọi để đảm bảo tất cả các thay đổi đang chờ xử lý là 'cam kết' là những gì tôi đang tìm kiếm. Đề xuất của bạn giống như liên kết 'OnPropertyChange'. Nó là doable, nhưng cũng gây ra nhiều sự kiện hơn tôi muốn xem. Tôi đang tìm một mẫu WPF chung để giải quyết loại vấn đề này. Cảm ơn bạn đã trả lời. – Thies

1

HI, Vâng, trong khi sử dụng WPF, chúng ta cần áp dụng để có ý thức khác.

Tôi về cơ bản sẽ liên kết thuộc tính Văn bản của TextBox với một trong các thuộc tính của tôi (Model, ViewModel, Code-Behind, bất kỳ điều gì khiến bạn hạnh phúc). Vì vậy, khi bạn xử lý CTRL + S bạn chỉ cần đi đến tài sản clr được ràng buộc và tiếp tục vui vẻ với tất cả các dữ liệu bạn muốn.

Hy vọng sẽ giúp bạn, nếu bạn yêu cầu mã ví dụ, hãy để lại nhận xét cho tôi. Ariel

5

Bạn có thể buộc các ràng buộc cụ thể để cập nhật sử dụng mã như sau:

var bindingExpression = txtInput.GetBindingExpression(TextBox.TextProperty); 
bindingExpression.UpdateSource(); 

Việc làm này nói chung là khó khăn vì không có cách nào tổng quát để có được tất cả các ràng buộc, cũng không phải sẽ bạn nhất thiết muốn tất cả chúng được cập nhật.

+0

Điều đó cũng có thể hoạt động. Câu trả lời được chấp nhận cho câu hỏi SO sau đây cung cấp cách để tự động chạy các quy tắc xác thực cho một trang. Tôi nghĩ rằng bạn có thể sửa đổi nó để gọi UpdateSource() trên tất cả các đối tượng BindingExpression thay thế. http://stackoverflow.com/questions/127477/detecting-wpf-validation-errors – Pwninstein

+0

Tôi đang tìm một giải pháp chung mà không phải làm cho tôi thay đổi ràng buộc trên tất cả các hình thức. Một cái gì đó cam kết tất cả các chỉnh sửa đang diễn ra. Cảm ơn bạn đã trả lời. – Thies

+0

Đây chính xác là những gì tôi đang tìm kiếm vì tôi có một số Thuộc tính có thể đính kèm sẽ lệnh trên chúng yêu cầu văn bản phải cập nhật. –

3

Tôi không đồng ý với/ArielBH. Vấn đề ở đây là sự tương tác giữa bàn phím và tiêu điểm logic và trừ khi bạn đã thay đổi tất cả các cập nhật Ràng buộc dữ liệu thành PropertyChanged, bạn có thể bỏ lỡ một số cập nhật dữ liệu nguồn trong một số trường hợp nhất định (ví dụ: nhấp vào nút trên Thanh công cụ). Ví dụ, kích hoạt cập nhật mặc định cho TextBox.Text là LostFocus và nhấp vào nút trên thanh công cụ không làm mờ tiêu điểm TextBox đang hoạt động.

Nếu bạn có một số cơ chế để đăng ký các điều khiển, thì bạn có thể buộc ràng buộc ràng buộc dữ liệu để cập nhật nguồn ở cùng một nơi mà bạn đang gọi EndEdit trong ứng dụng WinForms. Nó không gọn gàng hay thanh lịch, nhưng nó hoàn thành công việc.

Nếu ai đó đã đưa ra giải pháp tốt hơn, tôi cũng sẽ là đôi tai.

+1

Xem liên kết tôi đã đăng trong nhận xét của tôi với câu trả lời của commongenius để biết ví dụ về cách liên kết bắt buộc ràng buộc để cập nhật. Cấp, ví dụ được hiển thị không thực hiện chính xác điều đó, nhưng có thể dễ dàng sửa đổi để thực hiện những gì bạn đang đề xuất. :) – Pwninstein

5

Dựa trên câu trả lời của Pwninstein, bây giờ tôi đã triển khai EndEdit trong lớp phổ biến cho WPF Views/Windows sẽ tìm kiếm các ràng buộc và bắt buộc cập nhật chúng, mã bên dưới;

Mã bên dưới;

private void EndEdit(DependencyObject parent) 
{ 
    LocalValueEnumerator localValues = parent.GetLocalValueEnumerator(); 
    while (localValues.MoveNext()) 
    { 
     LocalValueEntry entry = localValues.Current; 
     if (BindingOperations.IsDataBound(parent, entry.Property)) 
     { 
      BindingExpression binding = BindingOperations.GetBindingExpression(parent, entry.Property); 
      if (binding != null) 
      { 
       binding.UpdateSource(); 
      } 
     } 
    }    

    for(int i=0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
    { 
     DependencyObject child = VisualTreeHelper.GetChild(parent, i); 
     this.EndEdit(child); 
    } 
} 

protected void EndEdit() 
{ 
    this.EndEdit(this); 
} 

Trong lệnh Save, tôi bây giờ chỉ cần gọi phương thức EndEdit, và tôi không phải lo lắng về việc lựa chọn lập trình viên khác của phương pháp ràng buộc.

+0

Đã chỉnh sửa câu trả lời trước của tôi để bao gồm nhận xét của tôi. Cảm ơn! Vui mừng đã giúp :) – Pwninstein

+0

Tôi upvoted này. Hoạt động tốt nhưng gây ra sự cố khi bật ảo hóa. Thay đổi mụcNguồn thanh cuộn nguyên nhân để ngừng hoạt động. Xem: [http://stackoverflow.com/questions/8107618/datagrid-scroll-bar-stops-working](http://stackoverflow.com/questions/8107618/datagrid-scroll-bar-stops-working) – CrazyIvan1974

1

Tôi tin rằng bạn có nghĩa vụ tuyên bố nhóm ràng buộc và sau đó tham chiếu nhóm ràng buộc đó trong mã. Tôi đặt của tôi vào phần tử Window gốc để nó có được các ràng buộc của tất cả các điều khiển trên Window.

<Window.BindingGroup> 
    <BindingGroup /> 
</Window.BindingGroup> 

this.BindingGroup.CommitEdit(); 
+0

Cảm ơn cho phản hồi. Trông có vẻ đầy hứa hẹn, nhưng tôi cần thử trước. – Thies

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