Cách tiếp cận tốt nhất trong MVVM không nhất thiết có nghĩa là dễ dàng. Tôi thích các phương pháp sau:
a) Tạo boolean để hiển thị từng đối tượng và liên kết từng đối tượng với đối tượng này (bằng công cụ chuyển đổi hiển thị bool->).
Phương pháp này trực quan và cổ điển nhất để đặt Chế độ hiển thị cho Control
.
b) Gắn với enum, với bộ chuyển đổi duy nhất cho từng đối tượng.
c) Liên kết với enum, bằng một công cụ chuyển đổi duy nhất có tham số.
Trong trường hợp của các Converter, Enum
là tốt nhất giữ không có trong Model
và ở phía bên của View
. Bởi vì vấn đề giải quyết qua một bên của View, điều này khá logic và ở đây để lưu trữ cấu trúc dữ liệu. Về nguyên tắc, nó không quan trọng.
Ví dụ:
public sealed class InvertableBooleanToVisibilityConverter : IValueConverter
{
enum Parameters
{
Normal,
Inverted
}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var boolValue = (bool)value;
var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);
if (direction == Parameters.Inverted)
return !boolValue ? Visibility.Visible : Visibility.Collapsed;
return boolValue ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}
Một vài ý kiến về cách tiếp cận khác:
d) Sử dụng một người quản lý nhà nước trực quan với khung chính boolean, và lái xe trạng thái từ VM với một tài sản gắn liền.
Đối với những trường hợp này, có vẻ phức tạp, do đó, không thấy điểm trong đó. Tuy nhiên, nếu các điều kiện đặt Chế độ hiển thị không khó, bạn có thể sử dụng VisualStateManager
.
e) Liên kết với VM enum từ mã phía sau và đặt hiển thị thông qua mã.
Mã phía sau trong trường hợp này không được biện minh khi bạn có thể giải quyết sự cố bằng cách sử dụng các công cụ điển hình của MVVM (Ràng buộc, chuyển đổi, v.v ...). Tôi nghĩ rằng, trong trường hợp này nó sẽ không phải là một sự vi phạm nguyên tắc của MVVM, nếu lựa chọn yếu tố để các Visibility
không phải là logic kinh doanh có liên quan, chẳng hạn như có thể đến thiết lập Tầm nhìn bằng cách nhấn các CheckBox
, ToggleButton
vv
bạn có thể hiển thị một số mã từ mô hình và viewmodel để xem enum và sử dụng trong vm – blindmeis
btw nếu chế độ xem của bạn chỉ muốn một đối tượng tại thời điểm viewmodel của bạn không phơi bày một đối tượng tại thời điểm? – blindmeis