WPF: ICommand, откройте текстовый файл в текстовом поле - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть небольшая проблема здесь, я должен открыть (прочитать) текстовый файл в виде обычного блокнота WPF c, но я должен сделать это с интерфейсом ICommand. Проблема в том, что когда я выбрал txt-файл, который хочу открыть, ничего не происходит, я просто вижу пустой блокнот. Есть какое-то решение для этого? Вот код:

    public class OpenCommand : ICommand
{

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

    public event EventHandler CanExecuteChanged;


    public void Execute(object parameter)
    {
        OpenFileDialog op = new OpenFileDialog();

        op.Filter = "textfile|*.txt";
        op.DefaultExt = "txt";
        if(op.ShowDialog() == true)
        {

            File.ReadAllText(op.FileName);

        }

    }
}

Возможно, bindig - это не то, чего я на самом деле не знаю.

                <MenuItem Header="File" >
                <MenuItem Header="New"/>
                <MenuItem Header="Open..." Command="{Binding MyOpenCommand}" CommandParameter="{Binding ElementName=textbox2, Path=Text}"/>
                <MenuItem Header="Save..." Command="{Binding MySaveCommand}" CommandParameter="{Binding ElementName=textbox2, Path=Text}"/>
                <Separator/>
                <MenuItem Header="Exit..." Command="{Binding MyExitCommand}"/>

            </MenuItem>

Есть привязка, я хочу увидеть файл в "textbox2"

<TextBox x:Name="textbox2" DockPanel.Dock="Left" 
             Grid.IsSharedSizeScope="True"
             AcceptsReturn="True"/> 

1 Ответ

0 голосов
/ 24 апреля 2020

Вы должны привязать TextBox к содержимому текстового файла.

В следующем примере используется повторно используемая RelayCommand, которая принимает делегата. Это делает передачу результата в источник привязки более элегантной.

ViewModel.cs

public class ViewModel : INotifyPropertyChanged
{
  public ICommand OpenCommand => new RelayCommand(ExecuteOpemFile);
  public ICommand ExitCommand => new RelayCommand(param => Application.Current.MainWindow.Close());

  private string textFileContent;   
  public string TextFileContent
  {
    get => this.textFileContent;
    set 
    { 
      this.textFileContent= value; 
      OnPropertyChanged();
    }
  }

  public ExecuteOpemFile(object commandParameter)
  {
    OpenFileDialog op = new OpenFileDialog();
    op.Filter = "textfile|*.txt";
    op.DefaultExt = "txt";

    if(op.ShowDialog() == true)
    {
      this.TextFileContent = File.ReadAllText(op.FileName);
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
  protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  {
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  }
}

RelayCommand.cs
Реализация скопировано из Документов Microsoft: передача командного логи c.

public class RelayCommand : ICommand
{
  #region Fields

  readonly Action<object> _execute;
  readonly Predicate<object> _canExecute;

  #endregion // Fields 

  #region Constructors

  public RelayCommand(Action<object> execute) : this(execute, null)
  {
  }

  public RelayCommand(Action<object> execute, Predicate<object> canExecute)
  {
    if (execute == null)
      throw new ArgumentNullException("execute");
    _execute = execute;
    _canExecute = canExecute;
  }

  #endregion // Constructors 

  #region ICommand Members

  [DebuggerStepThrough]
  public bool CanExecute(object parameter)
  {
    return _canExecute == null ? true : _canExecute(parameter);
  }

  public event EventHandler CanExecuteChanged
  {
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }
  }

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

  #endregion // ICommand Members 
}

MainWindow.xaml

<Window>
  <Window.DataContext>
    <ViewModel />
  </Window.DataContext>

  <StackPanel>
    <Menu>
      <MenuItem Command="{Binding OpenCommand}" />
      <MenuItem Command="{Binding ExitCommand}" />
    </Menu>

    <TextBox Text="{Binding TextFileContent}" />
</Window>
...