Как изменить текст в моем текстовом блоке в MainWindow с помощью iCommand? - PullRequest
0 голосов
/ 28 апреля 2018

enter image description here

В основном у меня есть один текстовый блок и 2 кнопки, я хочу, чтобы текстовый блок текста изменялся в соответствии с кнопкой, которую я нажимаю. Например, если я нажму на кнопку 1, появится сообщение «Кнопка 1 нажата»

если я нажму на кнопку 2, появится сообщение «Кнопка 2 нажата»

Это моя ViewModel

namespace ICommandProject2.ViewModel
{

    class ViewModel
    {
        public ICommand myCommand { get; set; }

        public ViewModel()
        {
            myCommand = new myCommand(ExecutedMethod);
        }

        private void ExecutedMethod (object parameter)
        {
            MainWindow m = new MainWindow();
            m.txtBlock.Text = "Button 1 is click";
        }


    }
}

Это мой командный класс

пространство имен ICommandProject2.Command

{

    class myCommand : ICommand
    {

        Action<object> actionExecuted;

        public myCommand(Action<object> ExecutedMethod)
        {
            actionExecuted = ExecutedMethod;
        }

        public event EventHandler CanExecuteChanged;

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

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

Это мое Mainwindow.xaml

<Window x:Class="ICommandProject2.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:ICommandProject2.ViewModel"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:ViewModel x:Key="vm"/>

    </Window.Resources>


    <Grid>
        <Button x:Name="btnOne" Content="Button 1" Command="{Binding myCommand, Source={StaticResource vm}}" HorizontalAlignment="Left" Margin="273,232,0,0" VerticalAlignment="Top" Width="75" FontSize="18"/>
        <TextBlock x:Name="txtBlock" HorizontalAlignment="Left" Margin="273,89,0,0" TextWrapping="Wrap" Text="This is a textblock" VerticalAlignment="Top" FontSize="36"/>
        <Button x:Name="btnTwo" Content="Button 2" HorizontalAlignment="Left" Margin="495,232,0,0" VerticalAlignment="Top" Width="75" FontSize="18" />

    </Grid>
</Window>

Когда я нажимаю на кнопку, ничего не происходит, что мне менять?

1 Ответ

0 голосов
/ 28 апреля 2018

используйте привязку для установки текста TextBlock.

создайте свойство для привязки в модели представления и измените это свойство в обработчике команд:

class ViewModel : INotifyPropertyChanged
{
    public ICommand myCommand { get; set; }

    private string _title = "This is a textblock";
    public string Title { get { return _title; } }

    public ViewModel()
    {
        myCommand = new myCommand(ExecutedMethod);
    }

    private void ExecutedMethod (object parameter)
    {
        _title = "Button 1 was clicked";
        OnPropertyChanged("Title");
    }
}

Я пропустил эту часть, но вы должны реализовать INotifyPropertyChanged для уведомления представления об изменениях в модели представления.

использовать Binding в виде:

<TextBlock x:Name="txtBlock" Text="{Binding Title}" ...


(команда, как она сейчас не работает, потому что она создает новый экземпляр Window (MainWindow m = new MainWindow();) вместо работы с открытым Window)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...