namespace BindingDemo{
public class StudentData : INotifyPropertyChanged{
private int _id = 0;
private string _name = "";
private int _age = 0;
public int ID {
get { return _id; }
set {
_id = value;
OnPropertyChanged("ID");
public string Name{
get { return _name; }
set {
_name = value;
OnPropertyChanged("Name");
public int Age {
get { return _age; }
set {
_age = value;
OnPropertyChanged("Age");
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName){
if(PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
隐藏代码
public partial class Window2 : Window
{
public Window2()
{
InitializeComponent();
Init();
}
private StudentData stuData;
public void Init()
{
stuData = new StudentData();
stuData.ID = 1001;
stuData.Name = "小明";
stuData.Age = 18;
//this.DataContext = stuData;//整个窗口内的所有元素都可以绑定此数据
stackPanel.DataContext = stuData;//仅stackPanel内的所有元素可以绑定此数据
}
private void btnChang_Click(object sender, RoutedEventArgs e)
{
stuData.ID = 1002;
stuData.Name = "小红";
stuData.Age = 17;
}
}
此时运行程序点击按钮更改信息时发现用户界面显示的数据也跟着刷新了。下面的内容是对上面的数据类做的进一步封装。最终效果是一样的。
先创建一个实现INotifyPropertyChanged接口的一个抽象类基类BindableObject,数据类只需要继承此抽象基类自然就实现了接口INotifyPropertyChanged
namespace BindingDemo
{
public abstract class BindableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
protected void SetProperty<T>(ref T item,T value,[CallerMemberName] string propertyName=null)
{
if(!EqualityComparer<T>.Default.Equals(item,value))
{
item = value;
OnPropertyChanged(propertyName);
}
}
}
}
namespace BindingDemo
{
public class StudentData : BindableObject
{
private int _id = 0;
private string _name = "";
private int _age = 0;
public int ID
{
get { return _id; }
set
{
SetProperty(ref _id,value);
}
}
public string Name
{
get { return _name; }
set
{
SetProperty(ref _name, value);
}
}
public int Age
{
get { return _age; }
set
{
SetProperty(ref _age, value);
}
}
}
}
[CallerMemberName]获取调用方的属性或方法名称
EqualityComparer<T> T为要比较的对象的类型
EqualityComparer<T>.Default 返回一个默认的相等比较器,用于比较此泛型自变量指定的类型。
WPF的数据绑定之数据绑定基础(绑定到元素属性)前路漫漫其修远兮数据绑定可以将任何控件的任何属性绑定到其他控件的属性、对象、数据库等,在WPF中,数据绑定主要在如下所示的两个对象之间建立关系。数据源对象:WPF将从改对象中提取信息,交由目标对象进行显示。 目标对象:从数据源中提取信息,并赋给该对象的属性。C#WPF 在Binding 中Path的意思<TextBox x:Name="txt1" /><TextBlock x:Name="txt2" Text="{Bi
绑定到DataContext,并设置绑定模式:
<Button x:Name="btn" Content="{Binding DataTime,Mode = OneTime}"/>
绑定到DataContext,并设置转换模式:
<Butto...
在窗体中放置了一个Slider控件和一个TextBlock控件:
<StackPanel Margin="5" Name="stackPannel">
<Slider Name="slider1" TickPlacement="Both" Minimum="1" Maximum="40" TickFrequency="1" Margin="3" Value="10" />
<TextBlock Text="This is a test tex
绑定单个数据源:
<TextBlock Text="{Binding PrintTimes}" Height="auto" Width="500" HorizontalAlignment="Center" />
现在,想绑定另一个属性名
是否可以将两个或多个值同时绑定?
可以用如下代码实现
<TextBlock>
<Run Text="Name = "/>
<Run Text="{Binding Name}"/>
<Run ...
<Button Content="删除" Width="90" Name="btnDel" Margin="10, 5, 5, 5" Command="{Binding CmdDelPic}" IsEnabled="{Binding ElementName=lbImgs, Path=SelectedItems.Count}"/>
参考文章:https://st
LiveCharts 是一个开源的图表库,可用于在 WPF 应用程序中显示图表。在 WPF 中使用 LiveCharts 的一种常用方法是使用数据绑定。
数据绑定是一种将数据从一个源(例如数据库、XML 文件或 C# 对象)传输到目标(例如 WPF 控件)的方法。数据绑定的优势在于,可以让数据在源和目标之间自动同步,因此可以轻松地在图表中显示动态数据。
要在 LiveCharts 中使用数据绑定,需要完成以下几个步骤:
1. 创建数据源:可以使用数据库、XML 文件或 C# 对象作为数据源。
2. 在 XAML 代码中声明数据源:使用 `<Window.Resources>` 标签声明数据源,并给数据源起一个名字。
3. 为图表指定数据源:使用 `Series` 标签,并在 `ItemsSource` 属性中指定数据源的名字。
4. 指定数据绑定字段:使用 `TitleBinding`、`Values` 和 `LabelPoint` 等属性指定要绑定的数据字段。
这是一个简单的例子,展示了如何在 LiveCharts 中使用数据绑定:
<Window.Resources>
<local:MyDataSource x:Key="MyDataSource" />
</Window.Resources>
<lvc:CartesianChart Series="{Binding SeriesCollection}">
<lvc:CartesianChart