Я пытаюсь реализовать Relay Commands с помощью Microsoft MVVM Community Toolkit. Если я помещаю код команды в ViewModel, он работает. Если я попытаюсь поместить код команды в отдельную папку, код команды не будет найден. Я создал очень простой пример ниже, поместив код команды в ViewModel (закомментирован) и попытавшись поместить код команды в свою собственную папку. Я подозреваю, что моя реализация кода в папке неверна. Я не нашел примеров командного кода в собственной папке с использованием команд Relay. Я могу поместить код команды в отдельную папку, просто используя ICommand и CommandBase.
App.xaml.cs
using RelayCommandLocation.Views;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace RelayCommandLocation
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
RelayCommandView relayCommandView = new RelayCommandView();
relayCommandView.DataContext = new RelayCommandViewModel();
relayCommandView.Show();
}
}
}
ViewModel в папке ViewModels
using Microsoft.Toolkit.Mvvm.Input;
using RelayCommandLocation.Commands;
using System.Windows.Input;
namespace RelayCommandLocation.ViewModels
{
public class RelayCommandViewModel : ObservableObject
{
public ICommand PushMeClick { get; set; }
// ################################################################################
// ############# This fails to compile = cannot find PushMeCommand code
public RelayCommandViewModel()
{
PushMeClick = new RelayCommand(PushMeCommandX.PushMeCommand);
}
// ********************************************************************************
// *********** This works. The RelayCommand code is in the ViewModel. *************
//public RelayCommandViewModel()
//{
// PushMeClick = new RelayCommand(PushMeCommand);
//}
//private void PushMeCommand()
//{
// MessageBox.Show($"Button pushed");
//}
}
}
Код команды в папке Commands
using System;
using System.Windows;
using System.Windows.Input;
namespace RelayCommandLocation.Commands
{
public class PushMeCommandX
{
public void PushMeCommand()
{
MessageBox.Show($"Button pushed");
}
}
}
XAML в папке Представления
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:RelayCommandLocation.Views"
mc:Ignorable = "d"
Title = "RelayCommandView" Height = "450" Width = "800">
<Grid>
<Button Content = "Push Me" Command = "{Binding PushMeClick}" Height = "50" Width = "75" />
</Grid>
</Window>
Можно ли поместить код команды реле в отдельную папку?
Вы должны прочитать несколько основных руководств по С# о классе, экземпляре и методах.
Из комментария @Klaus Gutter вам нужно создать экземпляр PushMeCommandX
в вашем RelayCommandViewModel
using Microsoft.Toolkit.Mvvm.Input;
using RelayCommandLocation.Commands;
using System.Windows.Input;
namespace RelayCommandLocation.ViewModels
{
public class RelayCommandViewModel : ObservableObject
{
public ICommand PushMeClick { get; set; }
// Create property or a field for your PushMeCommandX class.
public PushMeCommandX PushMe {get; set;}
public RelayCommandViewModel()
{
// Create an instance of the PushMeCommandX class to get access to it's methods.
PushMe = new PushMeCommandX();
PushMeClick = new RelayCommand(PushMe.PushMeCommand);
}
}
}
Я присоединюсь к @Sir Rufo, чтобы прочитать немного Руководство о классах C#.
Чтобы использовать новый метод, вам нужен экземпляр класса
PushMeCommandX
. Еслиx
это экземпляр, вы можете написатьnew RelayCommand(x => x.PushMeCommand);
. Но я не совсем понимаю, чего вы хотите добиться.