侧边栏壁纸
博主头像
陌上花 博主等级

回首万事皆休

  • 累计撰写 69 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录
WPF

Fody

种向日葵的人
2024-09-24 / 0 评论 / 0 点赞 / 24 阅读 / 0 字

How

  • 因为最新在学习WPF,找了一下在Core下是由很多官方的包可以很方便的实现MVVM模式的,但是在Framework下,很多建议是使用Standard,但是这种方法其实是存在很多弊端的,因为在Standard下很多包是安装不了的,所以我发现一个对于属性有一个比较好的包是Fody

How

  • 安装,需要安装以下两个。
    fody_nuget.png
  • 你会发现你的项目下多了一个FodyWeavers.xml文件,如果没有的话就显示全部文件,然后包括到项目中,一般只要安装包就会自动添加的,里面默认内容为:
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
  <PropertyChanged />
</Weavers>
  • 最简单的属性绑定于命令,因为最常用的就是这两个。
/*
注意只要继承自INotifyPropertyChanged即可,里面操作的都是属性
*/
public class MainViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public string Name { get; set; } = "Hello WPF";
    [AlsoNotifyFor(nameof(CurStr))]
    [OnChangedMethod(nameof(TimeChanged))]
    public string Time { get; set; }

    private void TimeChanged()
    {
        Debug.WriteLine("Time Changed");
    }

    public string CurStr => $"信息:{Name}_{Time}";
    public ICommand ChangeNameCommand
    {
        get
        {
            return new MyCommand((object arg) => true, ChangeName);
        }
    }

    private void ChangeName(object obj)
    {
        Name = DateTime.Now.ToString();
    }

}
//虽然fody对于属性绑定有好的支持,但是貌似不支持命令绑定,所以上面的MyCommand是我自己添加的类,继承自ICommand
 public class MyCommand : ICommand
 {
     public event EventHandler CanExecuteChanged;

     private Func<object, bool> _canExecute;
     private Action<object> _execute;

     public MyCommand(Func<object, bool> CanExecute, Action<object> Execute)
     {
         _canExecute = CanExecute;
         _execute = Execute;
     }
     public bool CanExecute(object parameter)
     {
         return this._canExecute?.Invoke(parameter) ?? false;
     }

     public void Execute(object parameter)
     {
         this._execute?.Invoke(parameter);
     }

 }

  • 以下是xaml中相关代码,其中model是命名空间不同
<Window
    x:Class="WPFTestFramework.MainWindow"
    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:local="clr-namespace:WPFTestFramework"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:WPFTestFramework.ViewModels"
    Title="MainWindow"
    Width="800"
    Height="450"
    d:DataContext="{d:DesignInstance vm:MainViewModel,
                                     IsDesignTimeCreatable=False}"
    mc:Ignorable="d">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <TextBox
            Grid.Row="0"
            MinHeight="50"
            Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
        <TextBox
            Grid.Row="1"
            MinHeight="50"
            Text="{Binding Time, UpdateSourceTrigger=PropertyChanged}" />
        <TextBlock
            Grid.Row="2"
            MinHeight="50"
            Text="{Binding CurStr}" />
        <Button
            Grid.Row="3"
            Command="{Binding ChangeNameCommand}"
            Content="更改名字" />
    </Grid>
</Window>
  • 运行
    fody_run.png

Tips

  • 虽然Fody在很大程度上解决了数据绑定的问题,同时也有一些比较丰富的Atrribute支持,但是对于命令的绑定支持的并不是很全面。
  • 事实证明,WPF的可玩性还是比Winform多得多。
0
WPF
博主关闭了所有页面的评论