前文:由于WPF 框架有很多,用到的我也就用到了 MVVM \MVVM.TOLKIT \Prsim\Caliburn.Micro 之前写那些框架的时候都有很多注解,但是CM的我感觉正规一定 很少。我就把我学的笔记做一下! 望各位进行学习!!!如遇到疑问,请多多指教,我会进行改正!!!
一、添加Nuget包
1、 Caliburn Micro
二、修改App.xml
1、 删除启动:Startui=“xxxMain.xaml”
2、填充资源 : Bootstrapper:新建的类 看第三节
```csharp
<ResourceDictionary>
<locals:Bootstrapper x:Key="bootstrapper"/>
</ResourceDictionary>
<Application x:Class="WPFUI.Control.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WPFUI.Control"
xmlns:locals="clr-namespace:WPFUI.Control.Micro"
>
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<locals:Bootstrapper x:Key="bootstrapper"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
三、新建Bootstrapper类
新建的类如下:
```csharp
namespace WPFUI.Control.Micro
{
public class Bootstrapper:BootstrapperBase
{
private SimpleContainer container = new SimpleContainer();
public Bootstrapper()
{
Initialize();
StartDebugLogger();
}
// [Conditional("DEBUG")] You can use this conditional starting with C# 9.0
public static void StartDebugLogger()
{
LogManager.GetLog = type => new DebugLog(type);
}
/// <summary>
/// 配置 用于 view与 viewModel之间的bingding 覆盖以配置框架并设置IoC容器。
/// </summary>
protected override void Configure()
{
container.Instance(container);
container.Singleton<IWindowManager, WindowManager>();
container.Singleton<IEventAggregator, EventAggregator>();
//利用反射 自动反射模型
foreach (var assembly in SelectAssemblies())
{
assembly.GetTypes()
.Where(type => type.IsClass)
.Where(type => type.Name.EndsWith("ViewModel"))
.ToList()
.ForEach(viewModelType => container.RegisterPerRequest(
viewModelType, viewModelType.ToString(), viewModelType));
}
}
/// <summary>
/// 覆盖此项以提供特定于IoC的实现。
/// </summary>
/// <param name="service"></param>
/// <param name="key"></param>
/// <returns></returns>
protected override object GetInstance(Type service, string key)
{
return container.GetInstance(service, key);
}
/// <summary>
/// 覆盖此项以提供特定于IoC的实现
/// </summary>
/// <param name="service"></param>
/// <returns></returns>
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
/// <summary>
/// 覆盖此项以提供特定于IoC的实现
/// </summary>
/// <param name="instance"></param>
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
/// <summary>
/// 启动项
/// </summary>
/// <param name="obj"></param>
/// <param name="e"></param>
protected override async void OnStartup(object obj, StartupEventArgs e)
{
var c = IoC.Get<SimpleContainer>();
//定位视图模型,定位关联视图,绑定它们并将其显示为根视图。
await DisplayRootViewForAsync(typeof(LogInWIndowViewModel));
}
}
}
四、如何bingding
1、关于view与ViewModel
在Caliburn Micro 中,不需要进行view与viewmodel之间进行绑定,此CM中自带可绑定事件。
2、关于按钮命令如何在ViewModel进行bingding
xmal中写法:
<Button Content="" x:Name="LoginBtn" Grid.Row="2" VerticalAlignment="Top"
Margin="-50 0 0 0" FontSize="15" Style="{StaticResource MosePressAnimation_Btn}"
HorizontalAlignment="Center" Foreground="White"/>
在viewModel中写法:
public class LogInWIndowViewModel : Screen
{
public LogInWIndowViewModel()
{
}
/// <summary>
/// 登录
/// </summary>
public void LoginBtn()
{
MessageBox.Show($"{UserName} + {Password}");
}
}
}
注意:是根据XAML中元素名称( x:Name)进行与viewmodel中进行binding的。
3、关于数据更新 Screen
具体使用 看上一个节点
//[AddINotifyPropertyChangedInterface] 因为Screen 继承了INotifyPropertyChanged 所以这句就不用加了
4、文本之间如何bingding
前端:
<TextBox Text="{Binding UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" Width="80" FontSize="13" Height="22" TextAlignment="Center" Padding="0" Foreground="White" BorderThickness="0 0 0 2" Background="Transparent" VerticalAlignment="Center"/>
ViewModel:
public class LogInWIndowViewModel : Screen
{
/// <summary>
/// 用户名
/// </summary>
public string UserName { get; set; } = "admin";
public LogInWIndowViewModel()
{
}
}
5、如何启动另一个窗口与另一个窗口进行view与ViewModel 之间的注意事项
1、如何启动另一个窗口:
public class LogInWIndowViewModel : Screen
{
private readonly IWindowManager _windowManager;
public LogInWIndowViewModel(IWindowManager windowManager)
{
_windowManager = windowManager;
}
/// <summary>
/// 登录 这是一个按钮命令
/// </summary>
public void LoginBtn()
{
if (!UserInformationManSql.SelectUser(new ControlSqlData.UserNameTable() { UserName = UserName, Password = UserPassWord }))
{
MessageBox.Show($"用户名 或 密码错误!!!");
}
else {
//启动另一个窗口视图
_windowManager.ShowDialogAsync(IoC.Get<UserRegistrationViewDialogViewModel>());
}
}
}
2、View与ViewModel 之间的注意事项:
1: 在CM 之间是使用的View与Viewmodel之间自动进行上下文绑定,但是如果出现以下格式:
在View 中添加一个文件夹,在ViewModel 中就需要添加一个相同同名的文件夹即可。 这样View与ViewModel 之间就可进行数据绑定!!!
注意:一定要相同的文件路径,否则有可能找不到此文件!!!
不定时上传更新! 如有疑问,请留言,我也会更改!!!!