2016-11-02 4 views
-1

Я пытаюсь вызвать функцию в viewmodel при запуске MVVM. Я думал, что это правильно, но код никогда не нажимает на вызов функции.Функция запуска вызова в viewmodel

Вот моя XAML:

<Window x:Class="TestWin.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
     xmlns:l="clr-namespace:Timeserver" 
     xmlns:viewmodel="clr-namespace:Timeserver.ViewModels" 
     Title="MainWindow" 
     Width="893" 
     Height="Auto" 
     Background="LightGray" 
     ResizeMode="NoResize" 
     SizeToContent="Height"> 
    <Window.DataContext> 
     <viewmodel:MainWindowViewModel /> 
    </Window.DataContext> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <i:InvokeCommandAction Command="{Binding LoadData}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 

Вот мой ViewModel (необходимые части):

namespace TestWin.ViewModels 
{ 
    class MainWindowViewModel 
    { 
     private StructsModel model; // my model class 

     private ICommand loadDataCmd; 

     private ICommand showTimeWindowCmd; 

     private ICommand toggleExecuteCommand { get; set; } 

     private bool canExecute = true; 

     public bool CanExecute 
     {    
      get 
      { 
       return this.canExecute; 
      } 

      set 
      { 
       if (this.canExecute == value) 
       { 
        return; 
       } 

       this.canExecute = value; 
      } 
     } 

     public ICommand ToggleExecuteCommand 
     { 
      get 
      { 
       return toggleExecuteCommand; 
      } 
      set 
      { 
       toggleExecuteCommand = value; 
      } 
     } 

     public ICommand ShowTimeWindowCmd 
     { 
      //code here 
     } 

     public ICommand LoadDataCmd 
     { 
      get 
      { 
       return loadDataCmd; 
      } 
      set 
      { 
       loadDataCmd = value; 
      } 
     } 

     public void LoadData(object parameter) 
     { 
      model.GetData(); 
     } 

     public MainWindowViewModel() 
     { 
      this.model = new StructsModel(); 
      LoadDataCmd = new RelayCommand(LoadData, param => this.canExecute); 
      ShowTimeWindowCmd = new RelayCommand(ShowTimeWindow, param => this.canExecute); 
      toggleExecuteCommand = new RelayCommand(ChangeCanExecute); 
     } 

     public void ShowTimeWindow(object parameter) 
     { 
      //code here 
     } 

     public void ChangeCanExecute(object obj) 
     { 
      canExecute = !canExecute; 
     } 
    } 
} 

Функция в вопросе, который не попал в LoadData(). Он вызывает GetData() в моем классе модели, который я не могу показать по причинам. Не уверен, что еще попробовать. Я видел другие вопросы о том, как я делаю то же самое, что и я. Моя другая функция ShowTimeWindow настроена точно так же и попадает.

+0

Кажется, что вы действительно не понимаете, как работает привязка данных. Я бы посоветовал вам ознакомиться с механизмом привязки данных WPF. Вы пытаетесь привязать метод, который не работает. – dymanoid

+0

Я сделаю больше исследований, я просто смотрел на другие вопросы на этом сайте, как этот: http://stackoverflow.com/a/17933290/2480598 Думал, что могу связать команду с методом. – pfinferno

+2

Не следует ли привязывать LoadDataCmd вместо привязки LoadData? – Steve

ответ

1

Вы можете создать свою ViewModel в коде позади. Чем вы можете назвать методы, которые вам нужны. Если вы хотите, чтобы идти к совершенству вы можете использовать шаблон Factory или инъекции зависимостей контейнера (например, Виндзор)

public MainWindow() 
{ 
    InitializeComponent(); 

    MainWindowViewModel vm = new MainWindowViewModel(); 

    DataContext = vm; 

    vm.LoadData(); 
} 
2

Если вы действительно хотите, чтобы вызов был сделан на Loaded, вы можете удалить код XAML

<Window.DataContext> 
    <viewmodel:MainWindowViewModel /> 
</Window.DataContext> 

и привязать режим просмотра от кода позади, как сказано выше. Затем будет запущена команда, с которой вы связаны, (если она имеет то же имя, что и в режиме просмотра), и вам не нужно будет вызывать vm.LoadData() в конструкторе.

Кроме того, если команда не используется ни для чего другого, кроме как для загрузки данных при загрузке, CanExecute бесполезен.

 Смежные вопросы

  • Нет связанных вопросов^_^