自学WPF的绑定 第1天 wpf 数据绑定

自学WPF的绑定 第1天

要求

一页面中有多个Controler,并且指向不同的Model,前后台数据都能绑定。

想法:

model 单例模式

Model用于保存运行时数据,从数据库或下位机传上来。所以用单例。

class NormalModel
    {
        #region 单例
        private static NormalModel? normalModel;
        private NormalModel() { }
        public static NormalModel GetNormalModel()
        {
            if(normalModel == null)
            {
                normalModel = new NormalModel();
            }
            return normalModel;
        }
        #endregion
        
        private int sodaMax = 200;
        public int SodaMax
        {
            get { return sodaMax; }
            set { sodaMax = value; }
        }
    }

前台

view部分

<Window ...
#用于导入其它项目的自定义类库,这里导入前先得在依赖项添加引入
        xmlns:zcl="clr-namespace:ZgxxerControlLibrary.Themes;assembly=ZgxxerControlLibrary"

#用于导入自定义类,
!!导入自定义类后一定要重新生成
        xmlns:ctl="clr-namespace:MyFactrory.Controler"

        mc:Ignorable="d"
        Title="MainWindow" Height="600" Width="1180">

#给自定义类新建一个对象,key用于指定对象的查找名称
    <Window.Resources>
        <ctl:NormalControler x:Key="ctl" x:Name="YY"/>
    </Window.Resources>
    
#给控件绑定数据{绑定 源={静态源 名称}} 
??动态源不会用
    <Canvas Grid.Row="1" DataContext="{Binding Source={StaticResource ctl}}">
	    <zcl:BufferTank ToolTip="小苏打" 
	    	Material="Soda" 
#当前控件依赖属性MaxValue  绑定到ctl对象里的SodaMax属性
	    	MaxValue="{Binding SodaMax, Mode=TwoWay}" 
	    	MinValue="{Binding SodaMin,Mode=TwoWay}" 
	    	Height="91" Canvas.Left="10" Canvas.Top="10" HorizontalAlignment="Center" VerticalAlignment="Center"/>
	    	
	    <Button Content="后台改变数据" Click="Button_Click" Canvas.Left="161" Canvas.Top="131"/>
    </Canvas>

viewControl部分

    public partial class MainWindow : Window
    {
    	//新建一个单例用来存controlers的列表
    	//主要是因为controler继承了INotifyPropertyChanged接口不能做单例
        //后台拿前台键的对象又很麻烦
        private ControlerList controlerList = ControlerList.GetControlerList();
        public MainWindow()
        {
            InitializeComponent();
            //去拿前台this.Resources["对象key"]的对象并存到另一个单例中

            controlerList.normalControler = (this.Resources["ctl"] as NormalControler)!;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
        //这样就能获得前台的对象并且动态更改属性了
            controlerList.normalControler.SodaMax++;
        }
    }

Controler里的代码

    class NormalControler : INotifyPropertyChanged
    {
        NormalModel model = NormalModel.GetNormalModel();
        public event PropertyChangedEventHandler? PropertyChanged;
        //实现接口,加入[CallerMemberName]后可不写参数类型,系统自动判断
        protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
        {
            if (this.PropertyChanged != null)
            //参数里的this不理解
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
//从model里取值
        public int SodaMax
        {
            get => model.SodaMax; 
            set
            {
                model.SodaMax = value;
                OnPropertyChanged();
            }
        }

controlerList代码

    class ControlerList
    {
    //没什么东西就是存controler对象,这样不用到处找
        private static ControlerList? controlerList;
        private ControlerList() { }

        public static ControlerList GetControlerList()
        {
            if(controlerList == null)
            {
                controlerList = new ControlerList();
            }
            return controlerList;
        }

        public NormalControler normalControler { get; set; }
    }

问题

!!导入自定义类后一定要重新生成
过程麻烦,是否应该直接view -> model
xaml动态源不理解
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值