using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Windows.Input;
namespace MVVMExample
{
// Model
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
// ViewModel
public class MainViewModel : INotifyPropertyChanged
{
private ObservableCollection<Person> _people;
private Person _selectedPerson;
private ICommand _addCommand;
public ObservableCollection<Person> People
{
get { return _people; }
set
{
_people = value;
OnPropertyChanged();
}
}
public Person SelectedPerson
{
get { return _selectedPerson; }
set
{
_selectedPerson = value;
OnPropertyChanged();
}
}
public ICommand AddCommand
{
get
{
if (_addCommand == null)
{
_addCommand = new RelayCommand(param => this.AddPerson());
}
return _addCommand;
}
}
public MainViewModel()
{
People = new ObservableCollection<Person>();
}
private void AddPerson()
{
People.Add(new Person { FirstName = "John", LastName = "Doe" });
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
// RelayCommand (for commanding in MVVM)
public class RelayCommand : ICommand
{
private readonly Action<object> _execute;
private readonly Func<object, bool> _canExecute;
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
// View (XAML)
/*
<Window x:Class="MVVMExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListView ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}">
<ListView.View>
<GridView>
<GridViewColumn Header="First Name" DisplayMemberBinding="{Binding FirstName}" />
<GridViewColumn Header="Last Name" DisplayMemberBinding="{Binding LastName}" />
</GridView>
</ListView.View>
</ListView>
<Button Content="Add Person" Command="{Binding AddCommand}" HorizontalAlignment="Right" VerticalAlignment="Bottom" Width="100" Margin="0,0,10,10"/>
</Grid>
</Window>
*/
}
Person 类表示数据模型,包含 FirstName 和 LastName 属性。MainViewModel 类实现了 INotifyPropertyChanged 接口,用于通知 UI 更新。它包含一个 ObservableCollection<Person> 集合 People 和一个 SelectedPerson 属性,以及一个命令 AddCommand 用于添加新的人。ICommand 接口,用于处理命令逻辑。它允许你将命令绑定到按钮或其他控件上。ListView 显示 People 集合,并通过 Button 触发 AddCommand。这个示例展示了如何使用 C# 和 WPF 实现 MVVM 模式的基本结构。
上一篇:c# 对象转换json
下一篇:c# ^
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站