WPF Wykrywanie który button został wciśnięty

0

Witam, od niedawna uczę się tworzyć aplikacje .Net zgodnie z modelem MVVM. No i chciałem zrobić sobie prostego painta. Chciałem wstawić kilka buttonów i w zależności który zostanie kliknięty przypisać odpowiednią wartość dla pola EditingModes w InkCanvas. No więc chciałem zrobić metodę Setter() która by zwracała odpowiednią wartość w zależności od tego jaki button został wciśnięty. I tu właśnie mam problem bo nie wiem jak sprawdzać te buttony. Sam kod XAML wygląda następująco:

<Window x:Class="wpf_podstaw5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:wpf_podstaw5"
        xmlns:vm="clr-namespace:wpf_podstaw5"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <vm:InkEditingModes />
    </Window.DataContext>
    <Window.Resources>
        <!--<local:InkEditingModes x:Key="editingModes" /> -->
        <!-- InkEditingModes editingModes=new InkEditingModes();-->
        <local:Konwerter x:Key="WhichOption" />
    </Window.Resources>
    <DockPanel>
        <Border 
            BorderBrush="Chocolate"
            BorderThickness="3"
            >
        <StackPanel Width="80">
                <Button x:Name="Drawing" Content="Draw" />
                <Button x:Name="Selecting" Content="Select" />
            <Button x:Name="Reset" Content="Reset" />
            </StackPanel>
        </Border>
        <InkCanvas EditingMode="{Binding EditingMode}" >
        </InkCanvas>
    </DockPanel>
</Window>
 

,,ViewModel" :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Input;

using wpf_podstaw5.ModelWidoku;

namespace wpf_podstaw5
{
    class InkEditingModes : INotifyPropertyChanged
    {
       private InkCanvasEditingMode _EditingMode;
       public InkCanvasEditingMode EditingMode
        {
            get
            {
                return _EditingMode;
            }
            set
            {
                _EditingMode = Setter();
                raiseEventThatPropertyChanged();  
            }
        }
        //Konstruktor // 
       public InkEditingModes()
       {
           _EditingMode = InkCanvasEditingMode.Ink;
           raiseEventThatPropertyChanged();
       }

        // Metody //
        public event PropertyChangedEventHandler PropertyChanged;   
        public void raiseEventThatPropertyChanged()
        {
            if (PropertyChanged!=null)
            PropertyChanged(this, new PropertyChangedEventArgs("EditingMode"));
        }

        public InkCanvasEditingMode Setter()
        {
            
            return InkCanvasEditingMode.Select;
        }
    }
}
 

Myślałem też żeby napisać jakiś konwerter tylko że nie wiem za bardzo jakby odnieść się do nazwy buttonów i jak to value z konwertera przypisywać do w moim przypadku _EditingMode.
Prosiłbym o pomoc, czego najlepiej tutaj użyć?

0

Użyj Command i CommandParameter, nie powinieneś odnosić się do nazwy buttonów. Możesz przekazać w parametrze enum który przypiszesz do EditingMode.

0
<Window x:Class="wpf_podstaw5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:wpf_podstaw5"
        xmlns:vm="clr-namespace:wpf_podstaw5"
        Title="MainWindow" Height="350" Width="525">
    <Window.CommandBindings>
        <CommandBinding Command="New" Executed="CommandBinding_Executed" />
    </Window.CommandBindings>
    <Window.DataContext>
        <vm:InkEditingModes />
    </Window.DataContext>
    <Window.Resources>
        <!--<local:InkEditingModes x:Key="editingModes" /> -->
        <!-- InkEditingModes editingModes=new InkEditingModes();-->
        <l:Konwerter x:Key="WhichOption" />
    </Window.Resources>
    <DockPanel>
        <Border 
            BorderBrush="Chocolate"
            BorderThickness="3"
            >
        <StackPanel Width="80">
                <Button x:Name="Drawing" Content="Draw" Command="New"/>
                <Button x:Name="Selecting" Content="Select" />
            <Button x:Name="Reset" Content="Reset" />
            </StackPanel>
        </Border>
        <InkCanvas EditingMode="{Binding EditingMode}" >
        </InkCanvas>
    </DockPanel>
</Window>
 
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using System.Windows.Input;

using wpf_podstaw5.ModelWidoku;

namespace wpf_podstaw5
{
    class InkEditingModes : INotifyPropertyChanged
    {
       private InkCanvasEditingMode _EditingMode;
       public InkCanvasEditingMode EditingMode
        {
            get
            {
                return _EditingMode;
            }
            set
            {
                _EditingMode = value;
                raiseEventThatPropertyChanged();  
            }
        }
        //Konstruktor // 
       public InkEditingModes()
       {
           _EditingMode = InkCanvasEditingMode.Ink;
           raiseEventThatPropertyChanged();
       }

        // Metody //
        public event PropertyChangedEventHandler PropertyChanged;   
        public void raiseEventThatPropertyChanged()
        {
            if (PropertyChanged!=null)
            PropertyChanged(this, new PropertyChangedEventArgs("EditingMode"));
        }

        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            EditingMode = InkCanvasEditingMode.Select;
        }
    }
}

Próbuje już na różne sposoby i ciągle niechce to działać bo zazwyczaj wyrzuca mi taki błąd:
Error 1 'wpf_podstaw5.MainWindow' does not contain a definition for 'CommandBinding_Executed' and no extension method 'CommandBinding_Executed' accepting a first argument of type 'wpf_podstaw5.MainWindow' could be found (are you missing a using directive or an assembly reference?) C:\Users\Dawid\Desktop\wpf_podstaw5\wpf_podstaw5\MainWindow.xaml 8 130 Paint_Specjal_Edyszyn

Czy ja wgl dobrze się za to zabieram ?

0

Aby te metody były widoczne dla widoku musiałbyś je tworzyć w code behind.

Tu masz jakiś przykład z ViewModelem http://stackoverflow.com/questions/12422945/how-to-bind-wpf-button-to-a-command-in-viewmodelbase

1 użytkowników online, w tym zalogowanych: 0, gości: 1