wpf stylet框架 关于View与viewmodel自动关联绑定的问题

1.1 命名规则 Aview 对应 AVIewModel, 文件夹 views 和 viewmodels

1.2 需要注册服务

//RootViewModel是主窗口

cs 复制代码
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}"

cs 复制代码
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="&#xe650;"
       Command="{s:Action OpenWindowAction}"
        FontFamily="{StaticResource IconFont}"
        FontSize="20"
        Foreground="{DynamicResource TextIconBrush}"
        Style="{StaticResource ButtonCustom}" />

3 窗口通信 , 注册服务 如上1.2:

cs 复制代码
 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;

子窗口代码

cs 复制代码
 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);
     });
 }
XML 复制代码
<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>
相关推荐
wangnaisheng5 小时前
【WPF】Opacity 属性的使用
wpf
姬激薄10 小时前
配置Hadoop集群-集群配置
wpf
python算法(魔法师版)10 小时前
.NET 在鸿蒙系统上的适配现状
华为od·华为·华为云·.net·wpf·harmonyos
大道随心1 天前
【wpf】11 在WPF中实现父窗口蒙版效果:原理详解与进阶优化
wpf
zizisuo1 天前
9.1.领域驱动设计
wpf
大道随心1 天前
【wpf】10 C#树形控件高效实现:递归构建与路径查找优化详解
开发语言·c#·wpf
离歌漠2 天前
WPF内嵌其他进程的窗口
c#·wpf
沉到海底去吧Go2 天前
【身份证识别表格】批量识别身份证扫描件或照片保存为Excel表格,怎么大批量将身份证图片转为excel表格?基于WPF和腾讯OCR的识别方案
ocr·wpf·excel·身份证识别表格·批量扫描件身份证转表格·图片识别表格·图片识别excel表格
csdn_aspnet2 天前
WPF 性能 UI 虚拟化 软件开发人员的思考
ui·wpf
冰茶_2 天前
WPF之绑定模式深入
学习·microsoft·微软·c#·wpf·绑定模式