- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下 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/
我编写了一个函数来包含两个 DateTime 之间的小时列表。 但最后它看起来并不是很容易阅读,这让我想对它进行单元测试,即使我正在从事的项目根本没有进行单元测试。 所以我的问题是,是否有一种更易读或
我一定是漏掉了什么,因为我还没有在网上找到这个非常基本的问题的答案。我正在使用能够容纳三个 int 的缓冲 channel 值。 然后我使用三个 goroutine 来填充它,一旦缓冲 channel
我发现如果一个矩阵(几乎)满了,那么将它存储在稀疏中会导致(更多)更多的计算时间。 虽然以稀疏形式存储完整矩阵是微不足道的,但我只想知道这一事实背后的原因。 我的推测是稀疏索引读取将是计算时间的主要贡
root@root:~# sudo du -ch --max-depth=1 --exclude=/home/ / du: cannot access ‘/sys/kernel/slab/L2TP/I
基本上我想创建一个 UIProgressView 在 3 秒内从 0.0(空)到 1.0(满)。有人能指出我在 swift 中使用 NSTimer 与 UIProgressView 的正确方向吗? 最
我是一名优秀的程序员,十分优秀!