Command Binding হল WPF (Windows Presentation Foundation) এর একটি শক্তিশালী ফিচার, যা ICommand ইন্টারফেস ব্যবহার করে UI উপাদানগুলোর (যেমন Button, Input Control ইত্যাদি) সাথে লজিক্যাল কার্যকলাপ (অথবা কমান্ড) সংযুক্ত করতে সাহায্য করে। Command Binding ব্যবহার করার মাধ্যমে, আপনি UI উপাদানগুলোর ইভেন্ট হ্যান্ডলিংকে ViewModel এর সাথে যুক্ত করতে পারেন, যা MVVM (Model-View-ViewModel) প্যাটার্নে কোডের ক্লিনলিনেস এবং পুনঃব্যবহারযোগ্যতা নিশ্চিত করে।
Command Binding in WPF
WPF-এ, Command Binding ব্যবহার করে আপনি Button বা অন্য Input Control (যেমন TextBox, MenuItem ইত্যাদি) এর ইভেন্টকে ICommand এর মাধ্যমে ViewModel এর মেথডের সাথে যুক্ত করতে পারেন। এর মাধ্যমে UI উপাদান এবং অ্যাপ্লিকেশন লজিকের মধ্যে স্পষ্ট বিভাজন তৈরি হয়।
Button Command Binding
WPF এ একটি Button এর সাথে Command Binding ব্যবহার করার জন্য আপনাকে প্রথমে একটি ICommand তৈরি করতে হবে, এবং তারপরে সেই কমান্ডটি Button এর Command প্রপার্টির সাথে বাইন্ড করতে হবে।
1. ViewModel: ICommand তৈরি
public class MainViewModel : INotifyPropertyChanged
{
private string _message;
public string Message
{
get { return _message; }
set
{
_message = value;
OnPropertyChanged(nameof(Message));
}
}
public ICommand ClickCommand { get; }
public MainViewModel()
{
// RelayCommand বা ICommand ইমপ্লিমেন্টেশন ব্যবহার করুন
ClickCommand = new RelayCommand(OnButtonClick);
}
private void OnButtonClick()
{
Message = "Button Clicked!";
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
- ClickCommand একটি
ICommandপ্রপার্টি, যা RelayCommand (বা অন্য কোনোICommandইমপ্লিমেন্টেশন) ব্যবহার করে মেথডOnButtonClickএর সাথে যুক্ত। OnButtonClickমেথডে,Messageপ্রপার্টি আপডেট করা হয়, যা UI-তে দেখানো হবে।
2. XAML: Button Command Binding
<Window x:Class="MVVMExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Command Binding Example" Height="300" Width="400">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<Button Content="Click Me" Command="{Binding ClickCommand}" Width="150" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBlock Text="{Binding Message}" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="0,0,0,50"/>
</Grid>
</Window>
- Button এর
Commandপ্রপার্টি ViewModel এরClickCommandপ্রপার্টির সাথে বাইন্ড করা হয়েছে। - TextBlock এর
Textপ্রপার্টি ViewModel এরMessageপ্রপার্টির সাথে বাইন্ড করা হয়েছে, যাButtonক্লিক করার পর আপডেট হবে।
TextBox বা Input Control এর সাথে Command Binding
TextBox বা অন্য Input Control (যেমন ComboBox, MenuItem) এর জন্যও Command Binding ব্যবহার করা যেতে পারে। এর মাধ্যমে আপনি Enter কী বা অন্য কোন ইভেন্টের মাধ্যমে কোনো কমান্ড চালাতে পারেন।
1. ViewModel: ICommand for TextBox Command
public class MainViewModel : INotifyPropertyChanged
{
public ICommand SubmitCommand { get; }
public MainViewModel()
{
SubmitCommand = new RelayCommand(OnSubmit);
}
private void OnSubmit()
{
// Submit করার লজিক এখানে
MessageBox.Show("Submit Command Triggered");
}
public event PropertyChangedEventHandler PropertyChanged;
}
2. XAML: TextBox Command Binding
<Window x:Class="MVVMExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Command Binding Example" Height="300" Width="400">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
<Grid>
<TextBox Width="200" Height="30" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,50" />
<Button Content="Submit" Command="{Binding SubmitCommand}" Width="100" Height="30" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
- TextBox এর সাথে কোনো সরাসরি কমান্ড না থাকলেও, Button এর
Commandপ্রপার্টি SubmitCommand এর সাথে বাইন্ড করা হয়েছে, যা TextBox এর ইনপুটের সাথে কাজ করতে পারে।
RelayCommand Implementation
ICommand ইন্টারফেসের জন্য সাধারণত RelayCommand ব্যবহার করা হয়, যা একটি সিম্পল কমান্ড ইমপ্লিমেন্টেশন প্রদান করে। এটি Command এর Execute এবং CanExecute মেথডগুলোকে নিয়ন্ত্রণ করে।
public class RelayCommand : ICommand
{
private readonly Action _execute;
private readonly Func<bool> _canExecute;
public RelayCommand(Action execute) : this(execute, null) { }
public RelayCommand(Action execute, Func<bool> canExecute)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute));
_canExecute = canExecute;
}
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
public bool CanExecute(object parameter) => _canExecute == null || _canExecute();
public void Execute(object parameter) => _execute();
}
কমান্ড বাইন্ডিং এর সুবিধা
- MVVM প্যাটার্নের সাথে ভাল ইন্টিগ্রেশন: ViewModel-এ লজিক থাকলে, UI উপাদানগুলোর ইভেন্ট হ্যান্ডলিং কোড থেকে পৃথক রাখা যায়।
- টেস্টেবল কোড:
ICommandএর মাধ্যমে ViewModel এ কমান্ড যুক্ত করা সহজ হয়, যা অ্যাপ্লিকেশন লজিকের টেস্টিংকে সহজ করে। - UI স্বাধীনতা: UI এর ইভেন্টগুলো ViewModel এ যুক্ত করা যায়, যার ফলে UI এর লেআউট পরিবর্তন হলেও লজিক অপরিবর্তিত থাকে।
সারাংশ
- Command Binding WPF এবং MVVM প্যাটার্নে খুবই গুরুত্বপূর্ণ একটি ফিচার, যা UI উপাদানগুলোর (যেমন Button, TextBox) ইভেন্টকে ViewModel এর কমান্ডের সাথে যুক্ত করে।
- ICommand ইন্টারফেস ব্যবহার করে কমান্ডগুলোর Execute এবং CanExecute মেথডগুলো নিয়ন্ত্রণ করা হয়।
- RelayCommand একটি সাধারণ কমান্ড ইমপ্লিমেন্টেশন যা কমান্ডের কার্যক্রম এবং শর্তাবলী নির্ধারণ করতে ব্যবহৃত হয়।
Read more