gpt4 book ai didi

c# - WPF 数据绑定(bind)困惑

转载 作者:太空狗 更新时间:2023-10-30 01:17:46 25 4
gpt4 key购买 nike

我刚刚开始学习有关 WPF 的类(class),我对与数据绑定(bind)相关的某些领域有些困惑。我没有语法问题,但很可能犯了一些新手错误,我有几个问题。

我已经完成了一个带有 2 个文本框的简单屏幕,当我单击一个按钮时,这两个项目被添加到一个列表框中。

XAML 的 Window 标签内引用到人类

 xmlns:classes="clr-namespace:WPF_Course.Classes"

添加了一个窗口资源

<Window.Resources>
<classes:People x:Key="people"/>
</Window.Resources>

这是我声明列表框的方式

<ListBox DataContext="{Binding Source={StaticResource people}}"
ItemsSource="{Binding Persons}"
x:Name="PersonListBox">

<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<StackPanel>
<TextBlock Text="{Binding FullName}"/>
</StackPanel>
</Grid>
</DataTemplate>

</ListBox.ItemTemplate>
</ListBox>

所以,我添加了一个 DataContext到我的列表框,我将它绑定(bind)到我的人员资源,我还添加了一个 ItemSource它查看我的 People 中的一个属性.

这是我的类(class)

public class People : ObservableCollection<Person> 
{
public ObservableCollection<Person> Persons { get { return persons; } set { persons = value; } }
private ObservableCollection<Person> persons = new ObservableCollection<Person>();

public People()
{
for (int i = 0; i < 1; i++)
{
// implicitly I add one item just for messing around with the constructor
Persons.Add(new Person()
{
Name = "Dummy",
LastName = "Dummy",
Age = 15
});
}
}
}

根据我到目前为止所做的,我有以下问题:

1) 两者之间有什么区别(它们具有相同的效果,但背后有更多的推理?)

ItemsSource = "{Binding Persons}"

ItemsSource = "{Binding Path = Persons }"

也可以通过离开 ItemSource = "{Binding}"我实际上只是在实例化一个 People例如,因此我的所有逻辑都从该类的构造函数中处理?我搞砸了它,它似乎是这样做的,但我不确定。

2) 在我的 Peoples 上我已经实现了 ObservableCollection<Person> 类(其中 Person 也是一个类)。最初我从构造函数本身对我的列表进行静态添加并且我没有在类中定义属性(ObservableCollection<person> type 属性)因此需要它(接口(interface)的实现)但是现在使用属性我真的需要它吗? ,所以我的问题是:

如果我的类的唯一目的是仅从构造函数加载它的集合中的东西(而不是从外部类,因此需要某种属性),那么用 ObservableCollection<myClass> 实现我的类是最佳实践吗?或定义我所做的相同类型的属性? (用于从外部类访问)

对于这些奇怪的问题,我深表歉意,因为我知道它们听起来有些愚蠢,我正在查看验证,因为我最近才开始使用 wpf。

谢谢

编辑 2:感谢您的所有回答,我现在明白了。另外,我忘了向您展示我是如何在我的集合中插入数据的。 (添加此编辑是为了让我记住如果我忘记了它,以及其他可能偶然发现此线程有类似困惑的人)

 ObservableCollection<Person> ppl;
public MainWindow()
{
InitializeComponent();
person = new Person();
stackPanelPerson.DataContext = person;

people = new People();
ppl = people.Persons;
PersonListBox.ItemsSource = ppl;
}

一开始我是这样做的

 ppl.Add(new Person() { Name = boxFirstName.Text, LastName = boxLastName.Text, Age = Int32.Parse(boxAge.Text) });

然后我意识到我正在我的 Person 类 (INotifyPropertyChanged) 上使用数据绑定(bind)和属性,所以我将其更改为:

 ppl.Add(new Person() { Name = person.Name, LastName = person.LastName, Age = person.Age});

再次感谢大家的回复!!祝你有美好的一天!

最佳答案

问题 1:

没有,没有区别。 {Binding xyz}{Binding Path=xyz} 相同,它几乎就像一个快捷方式。但它只能用于您在绑定(bind)中写入的第一件事,例如,您不能这样做:

{Binding ElementName=myElement, xyz}

相反,你会这样做:

{Binding ElementName=myElement, Path=xyz}

或者更好:

{Binding xyz, ElementName=myElement}

Here's一个相关的问题。

问题 2:

您所做的是正确的,您的人员集合应该作为Property 公开,为什么?因为这样您就可以绑定(bind)到它。

在这种情况下不需要静态属性。

我强烈建议研究MVVM 设计模式。可以找教程here

关于c# - WPF 数据绑定(bind)困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30570706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com