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>
相关推荐
code bean18 小时前
【WPF】WPF 项目实战:构建一个可增删、排序的光源类型管理界面(含源码)
wpf
沉到海底去吧Go1 天前
【图片识别改名】如何批量将图片按图片上文字重命名?自动批量识别图片文字并命名,基于图片文字内容改名,WPF和京东ocr识别的解决方案
ocr·wpf·图片识别改名·图片识别重命名·图片内容改名
lph19721 天前
自定义事件wpf
wpf
code bean1 天前
【WPF】从普通 ItemsControl 到支持筛选的 ItemsControl:深入掌握 CollectionViewSource 用法
wpf
碎碎念的安静2 天前
WPF可拖拽ListView
c#·wpf
界面开发小八哥2 天前
界面组件DevExpress WPF中文教程:Grid - 如何识别行和卡片?
.net·wpf·界面控件·devexpress·ui开发
TwilightLemon3 天前
WPF 使用CompositionTarget.Rendering实现平滑流畅滚动的ScrollViewer,支持滚轮、触控板、触摸屏和笔
wpf
Vae_Mars5 天前
WPF中自定义消息弹窗
wpf
Magnum Lehar5 天前
GameEngine游戏引擎前端界面wpf页面实现
前端·游戏引擎·wpf
TA远方5 天前
【C#】一个简单的http服务器项目开发过程详解
服务器·http·c#·wpf·web·winform·console