wpf mvvm模式如何在vm里面获取前台的控件并且在后台设置属性
时间: 2023-04-04 17:03:50 浏览: 549
可以使用命令绑定的方式,在前台控件上绑定一个命令,然后在 ViewModel 中实现该命令的逻辑,在命令的 Execute 方法中获取前台控件的引用,并设置其属性。具体实现可以参考 MVVM 框架中的 ICommand 接口和 RelayCommand 类。
相关问题
WPF MVVM模式教程
WPF MVVM(Model-View-ViewModel)是一种设计模式,用于Windows Presentation Foundation(WPF)应用程序架构,它将UI(视图)、业务逻辑(模型)和数据绑定(视图模型)分离。以下是一个简单的MVVM教程:
1. **理解角色**
- **模型(Model)**:包含业务逻辑和数据,通常是对数据库或者其他数据源的封装。
- **视图(View)**:用户界面元素,负责展示数据给用户,通过XAML文件创建。
- **视图模型(ViewModel)**:位于模型和视图之间,处理业务逻辑、数据绑定和命令处理,与具体的视图解耦。
2. **创建基本结构**
- 创建一个视图(`.xaml`文件),如UserControl或Window,定义UI元素。
- 创建对应的视图模型(`.cs`文件),继承自`INotifyPropertyChanged`以便通知视图数据变化。
```csharp
public class ViewModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; OnPropertyChanged(); }
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
```
3. **数据绑定**
在WPF中,使用`<Binding>`标签将视图模型属性与UI控件关联起来。例如,在`<TextBlock>`里绑定到`ViewModel.Name`:
```xaml
<TextBlock Text="{Binding Name}" />
```
4. **命令处理**
视图模型中可以定义`RelayCommand`来处理用户的动作,这样可以保持M-V-VM之间的清晰分离:
```csharp
public ICommand MyCommand => new RelayCommand(() => DoSomething());
```
这里` RelayCommand` 是一个从` GalaSoft.MvvmLight`库导入的命令处理器。
5. **实践应用**
在主窗口或视图中,创建一个新的`ViewModel`实例并将其作为DataContext,将视图与视图模型关联起来。
6. **注意事项**
- 遵循单一职责原则,每个类只做一件事。
- 使用依赖注入(DI)来管理组件间的依赖关系。
wpf mvvmlight 搭建mvvm框架举例 带自定义控件
好的,下面我将给你举一个带自定义控件的MVVM框架搭建的例子。
首先,让我们创建一个自定义控件。例如,我们创建一个名为“PersonControl”的控件,它有一个“Person”属性和一个“Update”事件:
```csharp
public class PersonControl : Control
{
static PersonControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(PersonControl), new FrameworkPropertyMetadata(typeof(PersonControl)));
}
public static readonly DependencyProperty PersonProperty =
DependencyProperty.Register("Person", typeof(Person), typeof(PersonControl), new PropertyMetadata(null));
public Person Person
{
get { return (Person)GetValue(PersonProperty); }
set { SetValue(PersonProperty, value); }
}
public static readonly RoutedEvent UpdateEvent =
EventManager.RegisterRoutedEvent("Update", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PersonControl));
public event RoutedEventHandler Update
{
add { AddHandler(UpdateEvent, value); }
remove { RemoveHandler(UpdateEvent, value); }
}
protected virtual void OnUpdate()
{
RoutedEventArgs args = new RoutedEventArgs(UpdateEvent, this);
RaiseEvent(args);
}
}
```
然后,我们创建一个ViewModel类,它将包含我们需要绑定到UI的命令和属性。例如,我们创建一个名为“MainViewModel”的类,它有一个“Person”属性和一个“UpdateCommand”命令:
```csharp
public class MainViewModel : ViewModelBase
{
private Person _person;
public Person Person
{
get { return _person; }
set { _person = value; RaisePropertyChanged(() => Person); }
}
public RelayCommand UpdateCommand { get; private set; }
public MainViewModel()
{
Person = new Person { Name = "John Doe" };
UpdateCommand = new RelayCommand(UpdatePerson);
}
private void UpdatePerson()
{
Person.Name = "Jane Doe";
}
}
```
接下来,我们创建一个View类,它将绑定到ViewModel类的属性和命令。例如,我们创建一个名为“MainWindow”的窗口,它包含一个“PersonControl”控件和一个按钮,用于更新Person的名称:
```xml
<Window x:Class="MVVMExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:MVVMExample"
xmlns:local="clr-namespace:MVVMExample.Controls"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
<Grid>
<local:PersonControl Person="{Binding Person}" Update="PersonControl_Update"/>
<Button Content="Update" Command="{Binding UpdateCommand}"/>
</Grid>
</Window>
```
在这个例子中,我们将“PersonControl”控件添加到窗口中,并将其绑定到ViewModel类的“Person”属性。我们还订阅了“Update”事件,以便在单击按钮时更新Person的名称。
最后,我们需要在“PersonControl”的模板中包含一个按钮,并将其绑定到“Update”事件:
```xml
<Style TargetType="{x:Type local:PersonControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:PersonControl}">
<StackPanel>
<TextBlock Text="{Binding Person.Name}"/>
<Button Content="Update" Command="{Binding DataContext.UpdateCommand, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>
<Button Content="Update from Control" Click="Button_Click"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
```
现在,我们已经完成了带自定义控件的MVVM框架搭建。当我们启动应用程序时,将显示一个窗口,其中包含一个自定义控件和一个按钮。当我们单击按钮时,Person的名称将更新为“Jane Doe”。
希望这个例子能够帮助你了解如何使用WPF和MVVMLight搭建带自定义控件的MVVM框架。如果你有任何疑问,请随时问我。
阅读全文
相关推荐
















