2013-02-25 22 views
6

lệnh Tôi đã sau:RelayCommand CanExecute hành vi

<Button x:Name="bOpenConnection" Content="Start Production" 
     Grid.Row="0" Grid.Column="0" 
     Height="30" Width="120" Margin="10" 
     HorizontalAlignment="Left" VerticalAlignment="Top" 
     Command="{Binding Path=StartProductionCommand}"/> 

StartProductionCommand = new RelayCommand(OpenConnection, CanStartProduction); 

private bool CanStartProduction() 
{ 
    return LogContent != null && !_simulationObject.Connected; 
} 

CanStartProduction được kiểm tra chỉ khi tôi thay đổi kích thước UI và không được cập nhật một cách nhanh chóng. Bất kỳ ý tưởng nào tại sao nó không được cập nhật mỗi khi họ thay đổi giá trị?

Trả lời

15

Các CommandManager thấy không có cách nào để biết rằng lệnh phụ thuộc vào LogContent_simulationObject.Connected, vì vậy nó không thể đánh giá lại CanExecute tự động khi các đặc tính này thay đổi.

Bạn có thể yêu cầu đánh giá lại một cách rõ ràng bằng cách gọi CommandManager.InvalidateRequerySuggested. Lưu ý rằng nó sẽ đánh giá lại CanExecute cho tất cả các lệnh; nếu bạn muốn làm mới chỉ một, bạn cần phải tăng sự kiện CanExecuteChanged trên chính lệnh bằng cách gọi StartProductionCommand.RaiseCanExecuteChanged.

+0

bạn có thể đưa ra ví dụ hoặc liên kết bài đăng về cách sử dụng tính năng này không? Tôi có nghĩa là nơi bạn gọi này? – batmaci

+1

@batmaci, bạn chỉ cần gọi 'CommandManager.InvalidateRequerySuggested' khi bạn muốn lệnh' CanExecute' của lệnh được đánh giá lại –