我正在制作库存管理程序,所以我有这个数据网格
+==========+==========+==========+==========+
| C1 | C2 | C3 | C4 |
+==========+==========+==========+==========+
在开始C1和C2从MySQL填充,C3和C4充满了ziros。 当用户改变C3值时,程序用该等式填充C4(C4 = C3 * C2)。 我正在使用UserControl(只能使用System.Windows.Controls事件)。
我不知道如何开始这样做
答案 0 :(得分:1)
您可以通过Data Binding
和INotifyPropertyChanged
来实现此行为。
首先,您必须创建一个具有四个属性的类(在您的情况下,C1,C2,C3,C4)。
尝试这样的事情。
public class MyClass
{
public MyClass(int c1, int c2)
{
C1 = c1;
C2 = c2;
C3 = 0;
}
private int c1, c2, c3, c4;
public int C1
{
get { return c1;}
set { c1 = value; }
}
public int C2
{
get { return c2;}
set { c2 = value; }
}
public int C3
{
get { return c3;}
set { c3 = value; }
}
public int C4
{
get { return C3 * C2;}
}
}
现在,如果您查看该类,我已经创建了一个构造函数,它将接收两个参数c1
和c2
(您的数据库值),C1
和C2
是用这些值初始化。 C3
初始化为0. C4
只有一个返回C3
和C2
的产品的getter。
现在处理您的方案,当您更改C3
时,C4
会自动使用C3
和C2
的产品进行更新,您需要INotifyPropertyChanged
}
public class MyClass : INotifyPropertyChanged
{
public MyClass(int c1, int c2)
{
C1 = c1;
C2 = c2;
C3 = 0;
}
private int c1, c2, c3, c4;
public int C1
{
get { return c1;}
set { c1 = value; }
}
public int C2
{
get { return c2;}
set { c2 = value; }
}
public int C3
{
get { return c3;}
set { c3 = value; }
}
public int C4
{
get { return C3 * C2;}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
在您的代码隐藏中,使用类型为MyClass
的 ObservableCollection 并将其填充到您的数据库中。
ObservableCollection<MyClass> dbCollection = new ObservableCollection<MyClass>();
ObservableCollection<MyClass> DbCollection
{
get { return dbCollection; }
set { dbCollection = value; }
}
使用您的数据库数据填充此集合。
现在您必须将DataContext
的{{1}}设置为Window
本身。
在Window
的{{1}} Constructor
之后,Window
现在进行数据绑定 编辑你的Datagrid来做这样的事情。
InitializeComponents()
现在,您已将Datagrid绑定到Collection。但仍然有一块拼图丢失了。这是关于源属性更改的绑定目标(在本例中为DataGridTextColumn)。
为此你必须编辑MyClass类的属性
this.DataContext = this;
正如您所看到的,参数<DataGrid ItemsSource={Binding DbCollection}>
<DataGridTextColumn Binding="{Binding C1, UpdateSourceTrigger="PropertyChanged"}"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding C2, UpdateSourceTrigger="PropertyChanged"}"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding C3, UpdateSourceTrigger="PropertyChanged"}"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding C4, UpdateSourceTrigger="PropertyChanged"}"></DataGridTextColumn>
</DataGrid>
中的更改仅通知属性public int C1
{
get { return c1;}
set { c1 = value; NotifyPropertyChanged("C1"); }
}
public int C2
{
get { return c2;}
set { c2 = value; NotifyPropertyChanged("C2"); NotifyPropertyChanged("C4");}
}
public int C3
{
get { return c3;}
set { c3 = value; NotifyPropertyChanged("C3"); NotifyPropertyChanged("C4");}
}
public int C4
{
get { return C3 * C2;}
}
,但对于c1
和C1
,我们也会通知c2
因为{{1} }}是c3
和C4
的乘积。这意味着只要C4
和C3
中的任何一个发生更改,就需要更改C2
。
我知道在开始时要消化很多,但这是一个完整的解决方案。相信它会解决你的问题。欢迎提出问题。