Pet*_*r M 5 c# data-binding wpf object composite
我是第一次尝试WPF而且我正在努力解决如何将控件绑定到使用其他对象组合构建的类.例如,如果我有由两个单独的类构成的类Comp(请注意为清晰起见省略了各种元素):
class One {
int _first;
int _second;
}
class Two {
string _third;
string _fourth;
}
class Comp {
int _int1;
One _part1;
Two _part2;
}
Run Code Online (Sandbox Code Playgroud)
现在我明白我可以使用Comp中定义的"get"轻松绑定_int1.但是我如何绑定元素_part1._first,_part1._second.我是否在Comp级别为他们暴露了"getters"?或者我可以在复合类中公开它们并使用指向它们的绑定路径?这如何设置属性?
这是模式吗?
....
<TextBlock Name="txtBlock" Text="{Binding Path=Third}" />
....
class One {
int _first;
int _second;
}
class Two {
string _third;
string _fourth;
}
class Comp {
int _int1;
One _part1;
Two _part2;
int Int1 { get { return _int1; } set { _int1 = value; } }
int First { get { return _part1._first; } set { _part1._first = value; } }
int Second { get { return _part1._second; } set { _part1._second = value; } }
string Third { get { return _part2._third; } set { _part2._third = value; } }
string Fourth { get { return _part2.fourth; } set { _part2._fourth = value; } }
}
...
Comp oComp = new Comp();
txtBlock.DataContext = oComp;
...
Run Code Online (Sandbox Code Playgroud)
或者这是模式?(我不知道该放什么路径)
....
<TextBlock Name="txtBlock" Text="{Binding Path=_part2.Third}" />
....
class One {
int _first;
int _second;
int First { get { return _first; } set { _first = value; } }
int Second { get { return _second; } set { _second = value; } }
}
class Two {
string _third;
string _fourth;
string Third { get { return _third; } set { _third = value; } }
string Fourth { get { return _fourth; } set { _fourth = value; } }
}
class Comp {
int _int1;
One _part1;
Two _part2;
int Int1 { get { return _int1; } }
}
...
Comp oComp = new Comp();
txtBlock.DataContext = oComp;
...
Run Code Online (Sandbox Code Playgroud)
或者我正在努力重塑MV-VM(我慢慢开始理解)?
....
<TextBlock Name="txtBlock" Text="{Binding Path=Third}" />
....
class One {
int _first;
int _second;
}
class Two {
string _third;
string _fourth;
}
class Comp {
int _int1;
One _part1;
Two _part2;
}
class CompView {
Comp _comp;
CompView( Comp comp ) {
_comp = comp;
}
int Int1 { get { return _comp._int1; } set { _comp._int1 = value; } }
int First { get { return _comp._part1._first; } set { _comp._part1._first = value; } }
int Second { get { return _comp._part1._second; } set { _comp._part1._second = value; } }
string Third { get { return _comp._part2._third; } set { _comp._part2._third = value; } }
string Fourth { get { return _comp._part2.fourth; } set { _comp._part2._fourth = value; } }
}
...
Comp oComp = new Comp();
CompView oCompView = new CompView( oComp );
txtBlock.DataContext = oCompView;
...
Run Code Online (Sandbox Code Playgroud)
那我该怎么办呢?如果它是第一个或第三个模式,那么我似乎已经把我所有可爱的(不同的)分层数据并将其砸到平面配置,这样我就可以将它绑定到UI元素.它是如何发生的,还是有更好的方法(第二种模式?)
编辑
我没有提出我真的想要双向绑定的问题.所以属性访问器确实应该得到并设置.
编辑
更新了我的伪代码以显示setter和getter
编辑
我按照马克和朱利安提供的模式进行了实施,并实施了设定者,并对结果感到满意.出于某种原因,我确信自己的财产设置不会一直追溯到最终实体.
数据绑定通过属性工作,因此您不会在绑定中使用任何成员变量,例如:
int _first
public int First { get { return _first; } }
Run Code Online (Sandbox Code Playgroud)
您将使用 First 而不是 _first 进行绑定。通常我看到每个类都提供了自己的属性来绑定,在这种情况下,您可以将代码修改为:
class One : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
int _first = 1;
int _second = 2;
public int First { get { return _first; }
set { _first = value; OnPropertyChanged("First"); } }
public int Second { get { return _second; }
set { _second = value; OnPropertyChanged("Second"); } }
}
class Two : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
string _third = "Third";
string _fourth = "Fourth";
public string Third { get { return _third; }
set { _third = value; OnPropertyChanged("Third"); } }
public string Fourth { get { return _fourth; }
set { _fourth = value; OnPropertyChanged("Fourth"); } }
}
class Comp : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
int _int1 = 100;
One _part1 = new One();
Two _part2 = new Two();
public One Part1 { get { return _part1; }
set { _part1 = value; OnPropertyChanged("Part1"); } }
public Two Part2 { get { return _part2; }
set { _part2 = value; OnPropertyChanged("Part2"); } }
public int Int1 { get { return _int1; }
set { _int1 = value; OnPropertyChanged("Int1"); } }
}
Run Code Online (Sandbox Code Playgroud)
请注意,我将属性设为公开,同时将字段默认设置为私有。如果将父控件的 DataContext 分配给 Comp 的实例:
Comp comp = new Comp();
stack.DataContext = comp;
Run Code Online (Sandbox Code Playgroud)
然后,您可以绑定到 xaml 中的各个部分,如下所示:
<Window x:Class="TestApp.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestApp"
Title="Window1" Height="300" Width="300">
<StackPanel Name="stack">
<TextBlock Text="{Binding Int1}"/>
<TextBlock Text="{Binding Part1.First}"/>
<TextBlock Text="{Binding Part1.Second}"/>
<TextBlock Text="{Binding Part2.Third}"/>
<TextBlock Text="{Binding Part2.Fourth}"/>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
在这里,您将看到 StackPanel 被赋予一个 Comp 作为 DataContext(因此它的所有子级也具有该 DataContext,除非指定了另一个),并且文本绑定到它的成员类。
编辑:我还添加了设置器并实现了 INotifyPropertyChanged,这是数据绑定的重要组成部分。实现此功能后,您将能够将数据绑定到多个控件,并在更新时查看所有控件中的数据更新。您需要添加: using System.ComponentModel;
归档时间: |
|
查看次数: |
1492 次 |
最近记录: |