自学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; }
}