1.1 命名规则 Aview 对应 AVIewModel, 文件夹 views 和 viewmodels
1.2 需要注册服务
//RootViewModel是主窗口
public class Bootstrapper : Bootstrapper<RootViewModel>
{
/// <summary>
/// 配置IoC容器。为数据共享创建服务
/// </summary>
/// <param name="builder"></param>
protected override void ConfigureIoC(IStyletIoCBuilder builder)
{
builder.Bind<SharedDataService>().ToSelf().InSingletonScope();
builder.Bind<AddCategoryViewModel>().ToSelf();
}
2 主窗口打开子窗口 如:RootViewModel==>AddCategoryViewModel
命令绑定方式: Command="{s:Action OpenWindowAction}"
public RootViewModel _rootViewModel ;
private IWindowManager _windowManager;
public RootViewModel(IWindowManager windowManager,SharedDataService sharedService)
{
_windowManager = windowManager;
EditContent = new();
_rootViewModel = this;
_sharedService = sharedService;
_sharedService.CategoryNameChanged += OnCategoryAdded;
}
public void OpenWindowAction(object commandParameter)
{
_windowManager.ShowWindow(new AddCategoryViewModel(_sharedService)); //打开子窗口
}
//xaml :
<Button
Content=""
Command="{s:Action OpenWindowAction}"
FontFamily="{StaticResource IconFont}"
FontSize="20"
Foreground="{DynamicResource TextIconBrush}"
Style="{StaticResource ButtonCustom}" />
3 窗口通信 , 注册服务 如上1.2:
private readonly SharedDataService _sharedService= new();
public NoteContentModel _noteContentModel = new();
public RootViewModel(IWindowManager windowManager,SharedDataService sharedService)
{
_windowManager = windowManager;
EditContent = new();
_rootViewModel = this;
_sharedService = sharedService;
_sharedService.CategoryNameChanged += OnCategoryAdded;//监听共享数据服务事件
}
/// <summary>
/// 共享数据服务.
/// <para>如果跨线程修改数据(异步,多线程),需通过
/// Execute.OnUIThread(() => SharedValue = "新值");</para>
///
/// </summary>
public class SharedDataService: PropertyChangedBase
{
private string _CategoryName;
public string CategoryName
{
get { return _CategoryName; }
set { SetAndNotify(ref _CategoryName, value);
CategoryNameChanged?.Invoke(value); // 触发事件
}
}
/// <summary>
/// 分类名称发生变化事件.
/// </summary>
public event Action<string> CategoryNameChanged;
子窗口代码
public partial class AddCategoryViewModel : Screen
{
private readonly SharedDataService _sharedService;
public AddCategoryViewModel() { }
// 通过构造函数注入
public AddCategoryViewModel(SharedDataService sharedService)
{
_sharedService = sharedService;
}
private string _categoryName;
public string CategoryName
{
get => _categoryName;
set => SetAndNotify(ref _categoryName, value);
}
// 使用 Stylet 的 RelayCommand 替代 System.Windows.Input
public RelayCommand WinClosedCommand => new RelayCommand((o) =>
{
// 更新共享数据
_sharedService.CategoryName = CategoryName;
((HC.PopupWindow)o).Close();
关闭窗口(Stylet 标准方式)
//this.RequestClose(true);
});
}
<hc:Window x:Class="ProgramNotes.Views.AddCategoryView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:hc="https://handyorg.github.io/handycontrol"
xmlns:local="clr-namespace:ProgramNotes.Views"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:ProgramNotes.ViewModels"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:s="https://github.com/canton7/Stylet"
Width="300"
Height="50"
d:DataContext="{d:DesignInstance Type=vm:AddCategoryViewModel}"
AllowsTransparency="True"
ShowInTaskbar="False"
ShowTitle="False"
BorderThickness="1"
Background="{StaticResource WindowBrush}"
WindowStartupLocation="CenterScreen"
WindowStyle=" None"
mc:Ignorable="d">
<Grid Margin="8">
<hc:SimplePanel >
<TextBlock Margin="0"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Text="新的类别名称 " />
<TextBox
HorizontalAlignment="Stretch"
Height="28"
Text="{Binding CategoryName, Mode=TwoWay}"
Margin="75,0 50 0"
/>
</hc:SimplePanel>
<Button Grid.Row="0"
Grid.Column="1"
Margin="0"
Style="{StaticResource ButtonPrimary}"
Command="{Binding WinClosedCommand }"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type hc:Window}}}"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Height="26"
Content="确定"
>
</Button>
</Grid>
</hc:Window>