Tôi có UserControl WPF với ViewModel:
UserControl này có DependencyProperty phải được truyền tới ViewModel:
công khai tĩnh chỉ đọc DependencyProperty DurationProperty =
DependencyProperty.Register("Thời lượng", typeof(TimeSpan),
typeof(MyUserControl), FrameworkPropertyMetadata mới(TimeSpan.FromHour(1), OnDurationChanged ));
thời gian công khai Khoảng thời gian
{
nhận được { return (TimeSpan)GetValue(DurationProperty }
đặt { SetValue(DurationProperty, value }
}
khoảng trống tĩnh riêng tư OnDurationChanged(nguồn DependencyObject,
DependencyPropertyChangedEventArgs e)
{
Kiểm soát MyUserControl = nguồn là MyUserControl;
Thời lượng TimeSpan = (TimeSpan)e.NewValue;
control.UxRootContainer.SetDuration(thời lượng);
}
Điều này hoạt động tốt ngoại trừ chúng tôi sẽ không tham gia OnDurationĐã thay đổi
Giá trị mặc định được nhận trong sự kiện này.
Tôi biết tôi có thể tự gọi phương thức này trong hàm tạo, đặt thời lượng mặc định thành một hằng số, nhưng:
- Tôi phải tạo một hằng số cho mỗi DependencyProperty
- Ngay cả khi cuối cùng tôi không sử dụng giá trị mặc định, tôi vẫn phải gọi nó
Bất kỳ đề xuất hay nào về cách truyền giá trị mặc định tới ViewModel, miễn là giá trị mặc định là giá trị cuối cùng được sử dụng (không phải tập hợp giá trị khác).
Tôi quyết định viết một câu trả lời (chỉ trong trường hợp tôi sai :).
Trong trường hợp cụ thể, bạn đang tạoĐiều khiển tùy chỉnh, có nghĩa là một điều khiển đơn giản trong các Chế độ xem khác. Hai điểm:
- ViewModel không được tạo;
- Không đặt điều khiển này
Bối cảnh dữ liệu
.
Trong trường hợp này, ViewModel không phục vụ mục đích nào: không có mô hình cơ bản nào để trừu tượng hóa và không có gì (không phải Chế độ xem, không phải ViewModel) sẽ được sử dụng lại. Không có ViewModel nào tồn tại và giá trị mặc định đã là giá trị mặc định của thuộc tính phụ thuộc = vấn đề đã được giải quyết.
Đối với Bối cảnh dữ liệu
: Nếu bạn cố gắng sử dụng điều khiển này trong danh sách để liên kết các thuộc tính mục với nó, bạn sẽ luôn phải đi qua vùng chứa chính Bối cảnh dữ liệu
Tham chiếu nó (vì điều khiển có phần ghi đè và ràng buộc của nó) "{Văn bản ràng buộc}"
Dự án này sẽ không được tham khảo Chữ
thuộc tính, nhưng thay vào đó hãy tham khảo thuộc tính ViewModel Text của điều khiển, bạn sẽ phải làm điều gì đó như "{Binding DataContext.Text, InteractiveSource={RelativeSource FindAncestor, AncestorType=Grid}}"
). Điều này không bao giờ đúng trong bất kỳ thiết kế nào.
Tôi là một lập trình viên xuất sắc, rất giỏi!