2012-09-14 21 views
36

Tôi có chế độ xem AttributeView chứa tất cả các loại thuộc tính. Ngoài ra còn có một nút mà khi được nhấn, nó sẽ thiết lập các giá trị mặc định cho các thuộc tính. Tôi cũng có một lớp ViewModelBase là lớp cơ sở cho tất cả các kiểu ViewModels mà tôi có. Vấn đề là tôi không thể có vẻ để có được các nút bị ràng buộc với lệnh với WPF.Làm cách nào để liên kết nút WPF với lệnh trong ViewModelBase?

tôi đã cố gắng này, nhưng nó chỉ là không làm gì cả:

<Button Command="{Binding DataInitialization}" Content="{x:Static localProperties:Resources.BtnReinitializeData}"></Button> 

Lệnh được định nghĩa (trong ViewModelBase) như thế này:

public CommandBase DataInitialization { get; protected set; } 

và trên ứng dụng khởi động một phiên bản mới được tạo cho lệnh:

DataInitialization = new DataInitializationCommand() 

Tuy nhiên, liên kết WPF dường như không "tìm" ông lệnh (nhấn nút không có gì). ViewModel được sử dụng trong chế độ xem hiện tại có nguồn gốc từ ViewModelBase. Những gì khác tôi có thể thử (Tôi là khá mới để WPF vì vậy đây có thể là một câu hỏi rất đơn giản)?

+0

CommandBase có kế thừa từ ICommand không? Nút DataContext có chứa lệnh DataInitialization không? Bạn có bất kỳ thông báo trong bảng điều khiển đầu ra về ràng buộc? –

+0

Có nó kế thừa ICommand. Làm cách nào để kiểm tra DataContext của nút? Tôi không chắc chắn về các thông điệp trong đầu ra (nên có bất kỳ theo mặc định?). –

+0

sẽ dễ dàng hơn nếu bạn hiển thị thêm mã về viewmodel và xaml –

Trả lời

88
<Grid > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Button Command="{Binding ClickCommand}" Width="100" Height="100" Content="wefwfwef"/> 
</Grid> 

mã phía sau cho cửa sổ:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModelBase(); 
    } 
} 

Và ViewModel:

public class ViewModelBase 
{ 
    public ViewModelBase() 
    { 
     _canExecute = true; 
    } 
    private ICommand _clickCommand; 
    public ICommand ClickCommand 
    { 
     get 
     { 
      return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), _canExecute)); 
     } 
    } 
    private bool _canExecute; 
    public void MyAction() 
    { 

    } 
} 
public class CommandHandler : ICommand 
{ 
    private Action _action; 
    private bool _canExecute; 
    public CommandHandler(Action action, bool canExecute) 
    { 
     _action = action; 
     _canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return _canExecute; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     _action(); 
    } 
} 

Tôi hy vọng điều này sẽ cung cấp cho bạn những ý tưởng.

+0

Điều này đã cho tôi một đầu mối để tìm kiếm. Nó bật ra rằng lệnh đã được khởi tạo ở nhiều nơi và một trong những nơi này (đúng) đã được nhận xét ra :) Cảm ơn! –

+0

@kor_: Đó là lý do tại sao chúng tôi hỏi thêm mã số –

+6

Có đây là giải thích tốt nhất mà tôi tìm thấy sau nhiều lần tra cứu. Cảm ơn @Ethicallogics –

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