2018년 12월 21일 금요일

(c#학원)WPF Command 패턴, 데이터바인딩 실습예제

WPF Command 패턴, 데이터바인딩  실습예제
 
[실행화면]

[Emp.cs]
namespace CommandExam
{
    class Emp
    {
        public string Ename { get; set; }
        public string Job { get; set; }
        public override string ToString()
        {
            return "[" + Ename + "," + Job + "]";
        }
    }
}
 
[RelayCommand.cs]
using System;
using System.Windows.Input;
namespace CommandExam
{
    class RelayCommand : ICommand
    {
        #region Variables
        Func<object, bool> canExecute;
        Action<object> executeAction;
        #endregion
        #region Construction/Initialization
        public RelayCommand(Action<object> executeAction) :
       this(executeAction, null)
        {
        }
        public RelayCommand(Action<object> executeAction, Func<object, bool>
       canExecute)
        {
            this.executeAction = executeAction ?? throw new
           ArgumentNullException("Execute Action was null for ICommanding Operation.");
            this.canExecute = canExecute;
        }
        #endregion
        #region ICommand Member
        public bool CanExecute(object param)
        {
            // 사원이름을 입력하지 않으면 Add 버튼은 비활성화 된다.
            if (param?.ToString().Length == 0) return false;
            bool result = this.canExecute == null ? true :
           this.canExecute.Invoke(param);
            return result;
        }
        public void Execute(object param)
        {
            //System.Windows.MessageBox.Show(param.ToString());
            this.executeAction.Invoke(param);
        }
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
        #endregion
    }
}
 

[MainWindowViewModel.cs]
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace CommandExam
{
    class MainWindowViewModel : INotifyPropertyChanged
    {
        public Emp _SelectedEmp;
        public Emp SelectedEmp
        {
            get
            {
                return _SelectedEmp;
            }
            set
            {
                _SelectedEmp = value;
                OnPropertyChanged("SelectedEmp");
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName] string
Pname = null)
        {
            PropertyChanged?.Invoke(this, new
           PropertyChangedEventArgs(Pname));
        }
        public RelayCommand AddEmpCommand { get; set; }
        public ObservableCollection<Emp> Emps { get; set; }
        public MainWindowViewModel()
        {
            Emps = new ObservableCollection<Emp>();
            Emps.Add(new Emp { Ename = "홍길동", Job = "Salesman" });
            Emps.Add(new Emp { Ename = "김길동", Job = "Clerk" });
            Emps.Add(new Emp { Ename = "정길동", Job = "Manager" });
            Emps.Add(new Emp { Ename = "박길동", Job = "Salesman" });
            Emps.Add(new Emp { Ename = "성길동", Job = "Clerk" });
            AddEmpCommand = new RelayCommand(AddEmp);
        }
        public void AddEmp(object param)
        {
            Emps.Add(new Emp { Ename = param.ToString() });
        }
    }
}


[MainWindow.xaml.cs]
<Window x:Class="CommandExam.MainWindow"
        xmlns:local="clr-namespace:CommandExam"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>
    <StackPanel>
        <TextBlock>사원 이름을 입력하세요.</TextBlock>
        <TextBox x:Name="txtName"/>
        <Button Command="{Binding AddEmpCommand}"
CommandParameter="{Binding Text, ElementName=txtName}">Add</Button>
        <ListBox ItemsSource="{Binding Emps}" 
                 SelectedItem="{Binding SelectedEmp}"
                 DisplayMemberPath="Ename"
                 x:Name="empListBox"/>
        <Label x:Name="label" Content="{Binding SelectedItem, ElementName=empListBox}" 
               HorizontalAlignment="Center" 
               Height="40" 
               Margin="10,0,0,0" Width="137"              />
    </StackPanel>
</Window>



[MainWindow.xaml.cs]
using System.Windows;

namespace CommandExam
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}


 

댓글 없음:

댓글 쓰기