2011-07-09 26 views
16

Tôi thực sự thích Caliburn và quy ước đặt tên ràng buộc và ngạc nhiên rằng Khả năng hiển thị không bị ràng buộc theo cùng một cách "Công ước" CanNAME được sử dụng để bảo vệ Hành động. Theo như tôi biết là BooleanToVisibilityConverter chỉ được sử dụng khi Binding được sử dụng một cách rõ ràng trong Caliburn và không tự động giống như phương thức bảo vệ. Vì vậy, tôi đã suy nghĩ để sửa đổi các nguồn để ràng buộc tự động để "bool? ControlNameIsVisible()" (null bằng sụp đổ) hoặc tương tự. Tôi đã tự hỏi nếu đó là cách tiếp cận đúng và nếu soo nếu ai đó đã thực hiện việc thực hiện đã có và có thể chia sẻ nó ở đây.Khả năng hiển thị Tự động liên kết với quy ước đặt tên

Trả lời

17

Bạn có thể sử dụng phương pháp này nếu bạn muốn, nó hoàn toàn hợp lý. Một cách tiếp cận khác là sử dụng một Border có cùng tên với thuộc tính boolean trên mô hình khung nhìn của bạn. Caliburn.Micro sẽ thiết lập khả năng hiển thị của Border dựa trên giá trị của thuộc tính boolean.

<Border x:Name="ControlIsVisible"> 
    <TextBox x:Name="MyControl" ... /> 
</Border> 
+0

Được thực hiện tốt. Nó có thể không phải là giải pháp "đúng" cho tất cả các trường hợp, nhưng đây là một mẹo tuyệt vời. – IAmTimCorey

+0

Đối với những người không muốn thêm điều khiển bổ sung trên giao diện người dùng, bạn có thể ràng buộc khả năng hiển thị trực tiếp với thuộc tính. Điều này không autobind thông qua quy ước, nhưng mã nó mất là về giống như ở trên, và không có thêm kiểm soát để bọc. – liang

+0

Bạn có ví dụ nào không? –

9

Nếu bạn muốn có một giải pháp chung, đây là những gì tôi đã kết thúc với, dựa trên: Adding a convention for IsEnabled to Caliburn.Micro

Lưu ý các trọng của BindActions cũng như BindProperties để bạn có thể kiểm tra xem có Tầm nhìn vào những thứ có hành động bị ràng buộc với họ.

protected override void Configure() 
    { 
     base.Configure(); 

     ConventionManager.AddElementConvention<UIElement>(UIElement.VisibilityProperty, "Visibility", "VisibilityChanged"); 

     var baseBindProperties = ViewModelBinder.BindProperties; 
     ViewModelBinder.BindProperties = 
      (frameWorkElements, viewModel) => 
      { 
       BindVisiblityProperties(frameWorkElements, viewModel); 
       return baseBindProperties(frameWorkElements, viewModel); 
      }; 

     // Need to override BindActions as well, as it's called first and filters out anything it binds to before 
     // BindProperties is called. 
     var baseBindActions = ViewModelBinder.BindActions; 
     ViewModelBinder.BindActions = 
      (frameWorkElements, viewModel) => 
      { 
       BindVisiblityProperties(frameWorkElements, viewModel); 
       return baseBindActions(frameWorkElements, viewModel); 
      }; 

    } 

    void BindVisiblityProperties(IEnumerable<FrameworkElement> frameWorkElements, Type viewModel) 
    { 
     foreach (var frameworkElement in frameWorkElements) 
     { 
      var propertyName = frameworkElement.Name + "IsVisible"; 
      var property = viewModel.GetPropertyCaseInsensitive(propertyName); 
      if (property != null) 
      { 
       var convention = ConventionManager 
        .GetElementConvention(typeof(FrameworkElement)); 
       ConventionManager.SetBindingWithoutBindingOverwrite(
        viewModel, 
        propertyName, 
        property, 
        frameworkElement, 
        convention, 
        convention.GetBindableProperty(frameworkElement)); 
      } 
     } 
    } 
+1

Lưu ý rằng thao tác này không hoạt động đối với liên kết thuộc tính sâu của Caliburn.Micro (ví dụ: Person_ControlName). – Govert

+0

Điều này hoạt động tuyệt vời với Thanh công cụ. Tôi có thể hiển thị/ẩn toàn bộ Thanh công cụ trong một ToolBarTray giống như cách tôi có thể bật/tắt từng mục trong Thanh công cụ. Rất đẹp! Cho đến nay, không có vấn đề gì. Tôi càng sử dụng Caliburn.Micro ít Visual Studio có vẻ huyền diệu. – metaomniliquant