2014-04-04 20 views
6

Trong số View Tôi có ba đối tượng, trong đó có một đối tượng có thể nhìn thấy tại bất kỳ thời điểm nào. Trong số Model Tôi có một điều tra để đại diện cho ba tiểu bang.Cách tiếp cận tốt nhất để đặt Mức hiển thị trong MVVM

Tôi nên triển khai ViewModel của mình như thế nào?

a) Tạo boolean cho khả năng hiển thị của 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->).

b) Liên kết 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ố.

d) Sử dụng trình quản lý trạng thái trực quan với khung khóa boolean và điều khiển trạng thái từ máy ảo với thuộc tính được đính kèm.

e) Liên kết với VM enum từ mã phía sau và đặt mức hiển thị thông qua mã.

f)?

Tôi nghiêm túc hy vọng câu trả lời là f) (nghĩa là lựa chọn hiển nhiên thoát ra khỏi tôi), bởi vì tôi không thực sự vui mừng với a) thông qua e).

Suy nghĩ được hoan nghênh và đánh giá cao.

+0

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

+0

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

Trả lời

3

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

+0

Đồng ý, tôi bắt đầu viết mã c) và nhanh chóng dừng lại khi tôi nhận ra quan điểm của mình (bộ chuyển đổi) đã tham chiếu đến khai báo Enum của tôi từ Mô hình. Tôi thích cách tiếp cận trạng thái trực quan theo khái niệm, và nếu tôi sử dụng độ mờ thay vì các khung hình chính thì xaml sẽ không quá khủng khiếp. – 2stroke

+0

@ 2stroke: Mọi thứ đều có thể, nếu điều kiện không khó, bạn có thể sử dụng 'VisualStateManager'. Có lẽ tôi sẽ thêm nó vào câu trả lời của tôi. –

0
c) Bind to the enum, with a single converter that takes a parameter. 

Bằng cách này tôi đã giải quyết được vấn đề của mình với các nút radio nơi chỉ có một trong các nút radio được chọn. Dường như khó hơn nhưng bạn có thể tái sử dụng nó sau này và nếu bạn có ý tưởng thì nó rất dễ dàng.

e) Bind to the VM enum from code behind, and set visibility thru code. 

Ý tưởng tồi. Đó không phải là một thực hành tốt.

0

ngoài nhận xét của tôi. khi tôi có nhiệm vụ hiển thị nội dung khác nhau trong chế độ xem tùy thuộc vào các đối tượng khác nhau. tôi sử dụng hầu hết thời gian một contentcontrol và datatemplates.

<ContentControl Content="{Binding MyEnumObject}"/> 

bây giờ trong viewmodel của tôi có tất cả các đối tượng khác nhau các loại và thiết lập các đối tượng tôi muốn ràng buộc tài sản của tôi để xem.

private Blup _blup; //eg. is wanted when enum in model = 1 

    public object MyEnumObject {get;set;} 


    //set the content in your viewmodel 
    this.MyEnumObject = _blup; 

bây giờ bạn chỉ cần một datatemplate để hình dung đối tượng của bạn

<DataTemplate DataType="{x:Type local:Blup}"> 
    <view:MyBlupViewControl/> 
    </DataTemplate> 

nhưng có lẽ tôi đang hoàn toàn sai. nhưng câu hỏi actuall của bạn cho phép nhiều chỗ để giải thích

+0

Đây có thể là câu trả lời tôi đang tìm kiếm .... Tôi vẫn còn mới đối với WPF. Trong trường hợp của tôi, 3 phần tử giao diện người dùng mà tôi muốn chuyển đổi chỉ là 3 nhãn khác nhau với nội dung, định dạng, màu sắc khác nhau, v.v. Trong ví dụ của bạn, tôi cần tạo ba loại trong VM và tạo DataTemplate cho mỗi loại XAML với định dạng cần thiết? – 2stroke

+0

thats what i do :) – blindmeis

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