# **MvvmStudyDemo**
## Model(数据模型) View(视图) ViewModel(业务逻辑)
## **1.数据绑定,命名绑定**
```xaml
<TextBlock x:Name="tb1" Text="{Binding MainModel.KeyWord}" />
<TextBox x:Name="tb2" Text=""/>
<Button Content="搜索" Command="{Binding MainModel.BtnCommand}"
CommandParameter="{Binding ElementName=tb2, Path=Text}"/>
```
[Link](https://gitee.com/momj/wpf-mvvm-learning/tree/97f8e27d9440e9abd15ab420a3bb3ba30fb1b306/)
## 2.集合数据绑定,DataTemplate
```xaml
<ItemsControl Height="200" ItemsSource="{Binding Datas}">
<!--数据模型 DataTemplate-->
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}" Foreground="Orange"/>
<TextBlock Text="{Binding KeyWord}" Foreground="Green"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
```
## 3.集合命令绑定;ObservableCollection<**T>** 类:
```xaml
<StackPanel>
<!--从数据库查找相关关键词的数据 C# 数据源 绑定路径-->
<TextBlock x:Name="tb1" Text="{Binding MainModel.KeyWord}" />
<TextBox x:Name="tb2" Text=""/>
<Button Content="搜索" Command="{Binding MainModel.BtnCommand}"
CommandParameter="{Binding ElementName=tb2, Path=Text}"/>
<!--集合数据 ItemsControl ListView/ListBox/DataGrid Menu/ComboBox-->
<ItemsControl Height="200" ItemsSource="{Binding Datas}">
<!--数据模型 DataTemplate-->
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}" Foreground="Orange"/>
<TextBlock Text="{Binding KeyWord}" Foreground="Green"/>
<!--ViewModel中的数据属性-->
<!--不要去找Border,实际使用中Border非常频繁-->
<!--只写Banding,不写Path,表示当前的数据源/对象-->
<Button Content="删除"
Command="{Binding DataContext.BtnCommand,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=Window}}"
CommandParameter="{Binding}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
```
```c#
//TODO 集合控件的绑定对象
//若需要通知UI,不能是用List,
//ObservableCollection<T> 类:
//表示一个动态数据收集,该集合在添加或删除项或刷新整个列表时提供通知。
//
//集合子项变动通知:增减
// 1.子项中的属性变化 KeyWord="New Value" 变化由通知来处理 INotifyPropertyChanged
// 2.增加一个子项,或删除一个子项 变化由集合对象通知来处理 INotifyCollectionChanged
public ObservableCollection<MainModel> Datas { get; set; } = new ObservableCollection<MainModel>();
```
## 3.拖动事件
```xaml
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel>
<Border Width="50" Height="50" Background="Orange"
MouseLeftButtonDown="Border_MouseLeftButtonDown"/>
</StackPanel>
<Canvas Grid.Column="1" AllowDrop="True" Drop="Canvas_Drop"
Background="Transparent">
</Canvas>
</Grid>
```
Window后台cs代码
```C#
public partial class WindowDrag : Window
{
public WindowDrag()
{
InitializeComponent();
}
private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DragDrop.DoDragDrop(this, "Rectangle", DragDropEffects.Copy);
}
private void Canvas_Drop(object sender, DragEventArgs e)
{
string data = e.Data.GetData(typeof(string)).ToString();
if(data == "Rectangle")
{
Rectangle rectangle = new Rectangle()
{
Width =100,
Height =100,
Fill = Brushes.Red
};
var point = e.GetPosition((IInputElement)sender);
Canvas.SetLeft(rectangle, point.X);
Canvas.SetTop(rectangle, point.Y);
(sender as Canvas ).Children.Add(rectangle);
}
}
}
```
## 4.任意事件绑定,Command处理
**NuGet 引入 Microsoft.Xaml.Behaviors 类库 **
```xaml
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
```
Behaviors : 行为
使用XAML Behaviors for WPF,可以轻松地将互动性添加到您的应用程序中。行为封装了元素的可重复使用的功能,可以很容易地添加到你的XAML,而不需要更多的指令性代码。
**View**
```xaml
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<StackPanel>
<Border Width="50" Height="50" Background="Orange"
MouseLeftButtonDown="Border_MouseLeftButtonDown">
</Border>
<Border Width="50" Height="50" Background="Green">
<b:Interaction.Triggers>
<b:EventTrigger EventName="MouseLeftButtonDown">
<b:InvokeCommandAction Command="{Binding MouseLeftCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource
Mode=FindAncestor, AncestorType=Border}}"/>
</b:EventTrigger>
</b:Interaction.Triggers>
</Border>
</StackPanel>
<!--OLD <Canvas Grid.Column="1" AllowDrop="True" Drop="Canvas_Drop" Background="Transparent">-->
<Canvas Grid.Column="1" AllowDrop="True" Background="Transparent" x:Name="canvas">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Drop">
<b:InvokeCommandAction Command="{Binding DropCommand}"
PassEventArgsToCommand="True"/>
</b:EventTrigger>
<b:EventTrigger EventName="DragEnter">
<b:InvokeCommandAction Command="{Binding DragEnterCommand}"
CommandParameter="{Binding ElementName=canvas}"/>
</b:EventTrigger>
</b:Interaction.Triggers>
</Canvas>
</Grid>
```
1. 通过鼠标事件创建拖动对象
2. 通过Drop对象接收拖动对象,并且创建实际显示对象
**ViewModel**
```C#
public class DragViewModel
{
public ICommand MouseLeftCommand { get; set; }
public ICommand DropCommand { get; set; }
public ICommand DragEnterCommand { get; set; }
private Canvas _canvas;
public DragViewModel()
{
MouseLeftCommand = new Command
{
DoExecute = obj =>
{
DragDrop.DoDragDrop((DependencyObject)obj, "Rectangle", DragDropEffects.Copy);
}
};
DropCommand = new Command
{
DoExecute = obj =>
{
//DragEventArgs
var eventArgs = obj as DragEventArgs;
string data = eventArgs.Data.GetData(typeof(string)).ToString();
if (data == "Rectangle")
{
Rectangle rectangle = new Rectangle()
{
Width = 100,
Height = 100,
wpf mvvm prism案例
需积分: 5 144 浏览量
2023-04-20
17:09:58
上传
评论
收藏 21KB ZIP 举报
fyhs
- 粉丝: 633
- 资源: 13