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

发布于:2025-04-22 ⋅ 阅读:(18) ⋅ 点赞:(0)

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="&#xe650;"
       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>


网站公告

今日签到

点亮在社区的每一天
去签到