gpt4 book ai didi

c# - 对 ListView 和 DataContext 的一些不满

转载 作者:行者123 更新时间:2023-12-01 22:43:35 25 4
gpt4 key购买 nike

我编写了以下 C# 和 XAML 代码:

namespace ListViewExample1
{
public partial class MainWindow : Window
{
public ObservableCollection<MyColleague> myCollegues = new ObservableCollection<MyColleague>();

public MainWindow()
{
myCollegues.Add(new MyColleague() { Name = "Tim", Surname = "Meier" });
myCollegues.Add(new MyColleague() { Name = "Martin", Surname = "Hansen" });
myCollegues.Add(new MyColleague() { Name = "Oliver", Surname = "Drumm" });


InitializeComponent();
}

public ObservableCollection<MyColleague> MyColleagues
{
get { return this.myCollegues; }
}
}

public class MyColleague
{
public String Name { get; set; }

public String Surname { get; set; }
}
}

XAML 代码:

<Grid>
<ListView ItemsSource="{Binding}" DataContext="{Binding RelativeSource={RelativeSource ListViewExample1:MainWindow}, Path=myCollegues}">
<ListView.View >
<GridView >
<GridViewColumn Header="Name" Width="150" DisplayMemberBinding="{Binding Name}"/>
<GridViewColumn Header="Surname" Width="150" DisplayMemberBinding="{Binding Surname}"/>
</GridView>
</ListView.View>
</ListView>
</Grid>

现在我需要设置数据上下文,但此时我有些恼火。哪种 DataContext 语法是正确的?

最佳答案

设置DataContext的方法有几十种;没有人天生就是对的。

值得注意的是,如果您只需要绑定(bind)一个属性(在本例中为 ItemsSource),则根本没有理由在项目控件上设置 DataContext。设置 DataContext 可以简化多个属性的绑定(bind),因为所有绑定(bind)都使用相同的上下文。

如果您想在没有任何代码隐藏的情况下进行数据绑定(bind)(如您在评论中所说),您选择的示例不是很好,因为您正在创建对象在代码隐藏中。尝试使用无参数构造函数创建一个类,例如:

public class MyColleagueCollection : ObservableCollection<MyColleague>
{
public MyColleagueCollection()
{
Add(new MyColleague() { Name = "Tim", Surname = "Meier" });
Add(new MyColleague() { Name = "Martin", Surname = "Hansen" });
Add(new MyColleague() { Name = "Oliver", Surname = "Drumm" });
}
}

然后你可以这样做:

<ListView>
<ListView.ItemsSource>
<local:MyColleagueCollection/>
</ListView.ItemsSource>
...
</ListView>

或者您可以设置DataContext,并将ItemsSource 设置为"{Binding}"。或者在资源字典中创建对象,并使用 StaticResource 进行绑定(bind)。

您还可以将您的集合创建为 Window 类的一个属性(不是一个字段,正如 x0r 正确指出的那样)并执行此操作:

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}"...

现在使 Window 本身成为数据上下文对象,允许窗口中的任何元素直接绑定(bind)到其属性,而无需使用 RelativeSource

或者(我们还远未完成),您可以为窗口命名,然后按名称绑定(bind)到它:

<ListView ItemsSource=`{Binding ElementName=MyWindow, Path=MyCollection}"...

我们甚至不要使用 ObjectDataProvider

大多数人最终会做的——这与您将要找到的最接近“正确”的答案一样——是为主窗口创建一个 View 模型类,在窗口的构造函数中实例化它,并设置窗口的DataContext 到该对象。从那时起,主窗口显示的任何 View 都绑定(bind)到该 View 模型的属性。请参阅 Josh Smith 关于 Model/View/ViewModel 模式的文章,了解一个非常好的示例。

绑定(bind)和数据上下文用途广泛。这当然也意味着您可能会犯很多错误。它与领土相伴。不过,一旦您理解了它们,您就很少会遇到真正的问题。

关于c# - 对 ListView 和 DataContext 的一些不满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7288727/

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