Có cách nào để MVVM chọn văn bản trong hộp văn bản không? Khung MVVM mà tôi đang sử dụng là Bộ công cụ ánh sáng MVVM của Laurent Bugnion.MVVM-Làm cách nào để chọn văn bản trong hộp văn bản?
Trả lời
Bất cứ khi nào tôi đang cố gắng để trực tiếp ảnh hưởng đến các Xem trong một "tinh khiết" ứng dụng MVVM (không có mã-đằng sau trong View), tôi sẽ sử dụng Attached Properties để đóng gói bất cứ điều gì ảnh hưởng tôi đang cố gắng để đạt được. Tôi sẽ tạo một giao diện xác định các hành động mà tôi muốn sử dụng các sự kiện tùy chỉnh. Sau đó, tôi thực hiện giao diện này trong mỗi ViewModel sẽ chạy "các" các lệnh này trên View. Cuối cùng, tôi ràng buộc ViewModel của tôi với thuộc tính đính kèm trong định nghĩa View của tôi. Các mã sau đây cho thấy làm thế nào để điều này cho SelectAll và một TextBox. Mã này có thể dễ dàng được mở rộng để thực hiện bất kỳ hành động nào trên bất kỳ thành phần nào trong Chế độ xem.
tài sản và giao diện của tôi định nghĩa kèm theo:
using System.Windows;
using System.Windows.Controls;
using System;
using System.Collections.Generic;
namespace SelectAllSample
{
public static class TextBoxAttach
{
public static readonly DependencyProperty TextBoxControllerProperty = DependencyProperty.RegisterAttached(
"TextBoxController", typeof(ITextBoxController), typeof(TextBoxAttach),
new FrameworkPropertyMetadata(null, OnTextBoxControllerChanged));
public static void SetTextBoxController(UIElement element, ITextBoxController value)
{
element.SetValue(TextBoxControllerProperty, value);
}
public static ITextBoxController GetTextBoxController(UIElement element)
{
return (ITextBoxController)element.GetValue(TextBoxControllerProperty);
}
private static readonly Dictionary<ITextBoxController, TextBox> elements = new Dictionary<ITextBoxController, TextBox>();
private static void OnTextBoxControllerChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var element = d as TextBox;
if (element == null)
throw new ArgumentNullException("d");
var oldController = e.OldValue as ITextBoxController;
if (oldController != null)
{
elements.Remove(oldController);
oldController.SelectAll -= SelectAll;
}
var newController = e.NewValue as ITextBoxController;
if (newController != null)
{
elements.Add(newController, element);
newController.SelectAll += SelectAll;
}
}
private static void SelectAll(ITextBoxController sender)
{
TextBox element;
if (!elements.TryGetValue(sender, out element))
throw new ArgumentException("sender");
element.Focus();
element.SelectAll();
}
}
public interface ITextBoxController
{
event SelectAllEventHandler SelectAll;
}
public delegate void SelectAllEventHandler(ITextBoxController sender);
}
nét ViewModel của tôi:
public class MyViewModel : ITextBoxController
{
public MyViewModel()
{
Value = "My Text";
SelectAllCommand = new RelayCommand(p =>
{
if (SelectAll != null)
SelectAll(this);
});
}
public string Value { get; set; }
public RelayCommand SelectAllCommand { get; private set; }
public event SelectAllEventHandler SelectAll;
}
Xem định nghĩa của tôi:
<Window x:Class="SelectAllSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:SelectAllSample"
Title="Window1" Height="150" Width="150">
<x:Code><![CDATA[
public Window1()
{
InitializeComponent();
DataContext = new MyViewModel();
}
]]></x:Code>
<StackPanel>
<TextBox Text="{Binding Value}" loc:TextBoxAttach.TextBoxController="{Binding}" />
<Button Content="Select All" Command="{Binding SelectAllCommand}" />
</StackPanel>
</Window>
Lưu ý: Nhờ Josh Smith cho RelayCommand (xem mã trong Hình 3 trên this page). Nó được sử dụng trong MyViewModel trong ví dụ này (và chỉ về tất cả mã MVVM của tôi).
tìm giới thiệu tốt về các thuộc tính được đính kèm tại đây: http://www.codeproject.com/KB/WPF/AttachedBehaviors.aspx
- 1. Bỏ chọn văn bản trong hộp văn bản
- 2. Làm cách nào để chọn nhiều đoạn văn bản trong hộp văn bản WPF?
- 3. C# - cách đặt văn bản trong hộp văn bản để hiển thị gợi ý khi hộp văn bản trống?
- 4. Sử dụng jQuery để tô sáng (Chọn) Tất cả văn bản trong hộp văn bản
- 5. Chọn văn bản trong hộp văn bản bị tắt trong C#
- 6. văn bản nhiều dòng văn bản trong hộp giới hạn
- 7. Làm cách nào để chuyển văn bản trong hộp văn bản sang chức năng JavaScript?
- 8. Bạn làm cách nào để biện minh cho văn bản trong hộp văn bản HTML?
- 9. làm cách nào để đánh dấu/chọn văn bản trong hộp văn bản wpf mà không tập trung?
- 10. Phát hiện một số văn bản đã được chọn trong một hộp văn bản
- 11. Xóa văn bản của tất cả hộp văn bản trong tab đã chọn
- 12. Làm thế nào để chọn văn bản trong khối văn bản bạclight 3.0
- 13. Hộp văn bản Winform không thể hiển thị văn bản
- 14. Xác định dấu mũ/Lựa chọn bên trong DIV, Hộp văn bản, Văn bản, v.v.
- 15. Hộp văn bản HTML, văn bản tô sáng tự động
- 16. Xóa văn bản sau khi nhấp vào hộp văn bản
- 17. Làm cách nào để nối thêm giá trị văn bản vào hộp văn bản bằng jQuery?
- 18. C# làm cách nào tôi có thể chọn tất cả văn bản trong hộp văn bản khi tôi nhấp đúp?
- 19. WPF: Lấy văn bản "gói" ra khỏi hộp văn bản
- 20. Chèn hộp văn bản
- 21. Thay thế văn bản đã chọn trong vùng văn bản
- 22. Làm thế nào để vô hiệu hóa gói văn bản trong điều khiển hộp văn bản?
- 23. Làm cách nào để tắt hộp văn bản tùy thuộc vào hộp kiểm được chọn
- 24. FolderBrowser với hộp văn bản trong VB.NET
- 25. Làm thế nào để lấy văn bản từ hộp văn bản trong widget Android?
- 26. Thay đổi màu văn bản trong các hộp CHỌN
- 27. Làm cách nào để bỏ chọn văn bản trong UITextView?
- 28. Bộ chọn cho hộp văn bản trong HTML5?
- 29. Làm cách nào để thay đổi màu của văn bản tùy chọn của hộp chọn?
- 30. Cách chọn dòng văn bản trong textarea
Cảm ơn bạn rất nhiều! – Justin
Tôi gặp lỗi: "Ủy quyền 'System.Action' không lấy 1 đối số"? – Justin
Lỗi ở đâu? Đảm bảo rằng số lượng tham số trên định nghĩa trình xử lý sự kiện của bạn nhất quán với cách bạn xác định trình xử lý của mình (và sử dụng nó). Tôi đang sử dụng một Lambda với RelayCommand để nâng cao sự kiện trong ví dụ của tôi. –