2010-12-12 26 views
7

Tôi có một DocumentListView.Xaml với một ListBox và 3 nút.WPF/MVVM: Vô hiệu hóa trạng thái của nút khi ViewModel phía sau UserControl chưa được khởi tạo?

Đằng sau UserControl đó là một DocumentListViewModel với 3 nút và thuộc tính Command của chúng được liên kết với 3 RelayCommands.

Tôi có 3 Trình điều khiển như AdministrationController, BillingController, ReportController.

Mọi bộ điều khiển đều có thể quan sátCollections như Khách hàng 1: N Đặt hàng 1: N Tài liệu tương tự cho Bộ điều khiển khác.

Trong một Bộ điều khiển, tôi có tình huống ràng buộc đặc biệt. Khi DocumentListViewModel của tôi không được khởi tạo bởi ViewModel cha mẹ của nó như OrderViewModel (vì không có đơn đặt hàng nào được tải/tồn tại) thì UserControl của tôi có 3 nút được ENABLED. Ok người dùng có thể nhấn 3 nút và không có gì xảy ra nhưng vẫn rất khó hiểu và trên tất cả sự nhất quán trong giao diện người dùng của tôi đã biến mất.

Làm cách nào tôi có thể đặt Command of a Button làm mặc định thành "Disabled"?

Đặt các nút IsEnabled property thành false không giúp đỡ vì nút sẽ ở mãi mãi trong trạng thái vô hiệu hóa. No CanExecute TRUE sẽ đặt nó thành IsEnabled = true.

VÀ tôi không muốn giới thiệu một tài sản khác IsButtonEnabled ... mà ngu ngốc bởi vì sau đó tôi có cả hai thế giới winforms và wpf đằng sau nút logic của tôi ... ICommand là đủ.

Trả lời

17

Hoặc bạn có thể sử dụng một phong cách cho nút để vô hiệu hóa:

<Style TargetType="{x:Type Button}" x:Key="DisablerButton"> 
    <Style.Triggers> 
     <Trigger Property="Command" Value="{x:Null}"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

Với phong cách của bạn, thuộc tính IsEnabled được đặt thành TRUE như thế nào? – Elisabeth

+0

Bất cứ khi nào kích hoạt không được nhấn - thủ tục bình thường được gọi. I E. khi Command-property được thiết lập và CanExecute đánh giá là true. – Goblin

+0

Hoạt động! thats đếm ngay bây giờ! Cảm ơn Goblin. – Elisabeth

5

Đây là một tình huống thú vị. Thành thật mà nói tôi đã không bao giờ chạy vào trường hợp giao diện người dùng được tải và tương tác nhưng ViewModel vẫn chưa bị ràng buộc. Tuy nhiên, bỏ qua điều đó trong một khoảnh khắc, bạn có khả năng sử dụng một FallbackValue trên ràng buộc của bạn để liên kết với một NullCommand có sẵn trên toàn cầu hoặc một cái gì đó luôn trả về false cho phương thức CanExecute của nó.

<Button Command="{Binding SaveCommand, FallbackValue={StaticResource NullCommand}}" /> 
+0

Vấn đề là DocumentListView của tôi là một UserControl sử dụng 3 lần. Khi tôi làm Command = "{Binding SaveCommand, FallbackValue = {x: Null}}" /> SaveButton vẫn được kích hoạt. Nhưng tôi muốn vô hiệu hóa nó thông qua Commanding. – Elisabeth

+0

Phải, ví dụ của tôi dựa trên NullCommand có sẵn trên toàn cầu, không phải giá trị x: Null như bạn đã lưu ý sẽ bật nút. Trong mọi trường hợp, cách giải quyết của Goblin có lẽ dễ thực hiện hơn. – Josh

+1

Đây là một giải pháp cực kỳ tốt đẹp, đặc biệt là cho Silverlight. –

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