2016-10-11 1 views
0

Я пытаюсь получить доступ к кнопке из View в ViewModel, но я что-то отсутствует, как я получаю ошибку:кнопка доступа из View в ViewModel в C#

Severity Code Description Project File Line Suppression State 
Error CS1061 'MainWindow' does not contain a definition for 'Loadfile' and no extension method 'Loadfile' accepting a first argument of type 'MainWindow' could be found (are you missing a using directive or an assembly reference?) Uml-Creator C:\Users\HH\Source\Repos\UMLEditor\Uml-Creator\Uml-Creator\View\MainWindow.xaml 54 Active 

Цель этой кнопки, чтобы открыть OpenFileDialog. В моем ViewModel я обрабатывать щелчок так:

class Load 
    { 

     private void Loadfile(object sender, EventArgs e) 
     { 
      OpenFileDialog loadfile = new OpenFileDialog(); 
      if (loadfile.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       // File.Text = File.ReadAllText(loadfile.FileName); 
      } 
     } 
} 

И вид:

public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 

EDIT:

<Button x:Name="openButton" ToolTip="Open project" Click="Load_Click"> 
        <Image Source="pack://application:,,,/Images\Open.png" Stretch="UniformToFill" Height="17"></Image> 
       </Button> 
+0

Как определяется ваш 'xaml'? –

+1

Вы нарушаете концепцию MVVM. Ваш viewmodel не должен знать ничего о вашем представлении. Если вы хотите иметь поведение в своей модели viewmodel, вы должны использовать ICommand – Alex

+0

Кажется, что DataContext вашего представления не установлен в ваш класс 'Load'. – Rabban

ответ

3

В MVVM архитектура, Просмотр и ViewModel являются loosly связаны. Вы должны использовать команду как DelegateCommand и установить DataContext зрения, как экземпляр ViewModel как этот

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new Load(); 
} 

В XAML сделать что-то вроде

<Button .... Click = "{Binding ClickCommand}" /> 

Используйте NuGet, чтобы получить Prism пакеты и в классе нагрузки, используйте DelegateCommand как

public Load 
{  
    public DelegateCommand<object> _clickCommand; 
    public DelegateCommand<object> ClickCommand  
    { 
     get 
     { 
      if (_clickCommand == null) 
       _clickCommand = new DelegateCommand<object>(OnClickCommandRaised); 
      return _clickCommand; 
     } 
    } 

    public void OnClickCommandRaised(object obj) 
    { 
     //Your click logic. 
    } 
} 
Смежные вопросы