Member 12846307 Ответов: 0

Mvvm-как захватить в классах viewmodel и parametercommand, какая кнопка пользовательского интерфейса была нажата?


Для упрощения, критикуемый за написание романа на другом форуме без кода месяц назад, я сделал быстрый проект Wpf (использует MVVM) с 2 кнопками на пользовательском интерфейсе. Когда кнопка нажата, мне нужны мои классы ViewModelBase и/или ParameterCommand, чтобы знать, какая кнопка пользовательского интерфейса была нажата. Таким образом, я могу направить синтезатор речи на правильный текст, чтобы говорить. Спасибо за любую помощь!!

<Window x:Class="Wpf_School_Announce.MainWindow"
        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:Wpf_School_Announce"
        xmlns:vm="clr-namespace:Wpf_School_Announce.ViewModels"
        mc:Ignorable="d"
        Title="Announcements" Height="236.436" Width="293.218">
    <Window.Resources>
        <vm:ViewModelBase x:Key="viewModel"/>
    </Window.Resources>
    <Grid DataContext="{Binding Source=viewModel}">
        <StackPanel Margin="0,10">
            <Button x:Name="btn1stBell" Content="1st Bell" HorizontalAlignment="Center" VerticalAlignment="Top" Width="75" Margin="0,10" 
                     Command="{Binding ParameterCommand, Source={StaticResource viewModel}}" 
                    CommandParameter="{Binding Command, ElementName=btn1stBell}"/>
            <Button x:Name="btnLunchMenu" Content="Lunch Menu" HorizontalAlignment="Center" VerticalAlignment="Top" Width="75" Margin="0,10"
                     Command="{Binding ParameterCommand, Source={StaticResource viewModel}}" 
                    CommandParameter="{Binding Command, ElementName=LunchMenu}"/>
        </StackPanel>
    </Grid>
</Window>


namespace Wpf_School_Announce.ViewModels
{
    public class ViewModelBase
    {
        public ParameterCommand ParameterCommand { get; set; }

        public ViewModelBase()
        {
            ParameterCommand = new ParameterCommand(this);
        }

        public void ParameterMethod(string <Not sure what needs to go here>)
        {
           Debug.WriteLine("Parameter Comand:{0}", AnnoucementModel);
            //Todo: Need to find out which UI button was clicked to direct The Speech Synthesozer to the correct Speech Text.
        }
    }
}

namespace Wpf_School_Announce.ViewModels.Commands
{
    public class ParameterCommand : ICommand
    {
        public ViewModelBase ViewModel { get; set; }

        public ParameterCommand(ViewModelBase viewModel)
        {
            ViewModel = viewModel;
        }

        public event EventHandler CanExecuteChanged;

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

        public void Execute(object parameter)
        {
            ViewModel.ParameterMethod(parameter as String);
        }
    }
}


Что я уже пробовал:

Я пробовал использовать CommandParameter= " {Binding Source={StaticSelf ElementName}}"

Richard Deeming

Не совсем ясно, чего вы пытаетесь достичь, но вы должны быть в состоянии связать SelectedItem элемента управления списком к свойству на вашей виртуальной машине и передайте CommandParameter к команде кнопки, чтобы определить, какое действие предпринять.

Ничто из этого не требовало бы знания имени кнопки или предоставления виртуальной машине доступа к представлению.

0 Ответов