我有一个数据类型(模型),我希望通过使用数据绑定显示几个属性来在UI中显示其数据。它在GridView
或ListView
中工作,但当我只希望绑定单个模型而不是集合时,我如何做到这一点?
要对集合执行此操作,请在ListView
中执行以下操作:
<ListView x:Name="MyListView"
ItemsSource="{x:Bind Shapes, Mode=OneWay}">
<ListView.ItemTemplate>
<DataTemplate x:DataType="models:Shape">
<StackPanel>
<TextBlock Text="{x:Bind Name}"></TextBlock>
<TextBlock Text="{x:Bind NumberOfSides}"></TextBlock>
<TextBlock Text="{x:Bind Color}"></TextBlock>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在具有Shape
类型的ObservableCollection
(称为Shapes
)的页面上:
public sealed partial class MyPage : Page
{
// ...
public ObservableCollection<Shape> Shapes { get; set; }
// ...
}
具有以下型号Shape
:
public class Shape
{
public string Name { get; set; }
public string NumberOfSides { get; set; }
public string Color { get; set; }
}
我想做这样的事情,但这行不通:
<Grid>
<StackPanel>
<TextBlock Text="{x:Bind Name}"></TextBlock>
<TextBlock Text="{x:Bind NumberOfSides}"></TextBlock>
<TextBlock Text="{x:Bind Color}"></TextBlock>
</StackPanel>
</Grid>
1条答案
按热度按时间g0czyy6m1#
数据绑定实际上是在
ListView
上完成的,DataTemplate
只是声明了显示绑定模型的布局。要使用单个绑定项而不是集合来实现这一点,您需要使用仍然具有模板属性的控件。(Microsoft's official documentation)。
ContentControl
具有ContentTemplate
属性,它可以像ListView
或GridView
一样包含DataTemplate
!然后可以在C#代码中设置ContentControl
的Content
属性,或者绑定到它(与绑定到ListView
或GridView
的ItemsSource
属性的方式相同,只是使用单个项而不是集合)。简单的方法
下面的示例有效(请注意,
DataTemplate
及其所有子项与它们在ListView
或GridView
中的显示方式相同):然后在C#代码中:
完整的数据绑定方式
您也可以使用数据绑定来绑定到shape属性,但这需要更多的工作。首先将绑定添加到
ContentControl
,如下所示:并在
MyPage
上添加要绑定到的MyShape
属性:这样做是行不通的。当你一开始设置它的时候,它可能会工作,但是如果你改变
MyShape
,绑定的UI将不会更新。请注意,如果使用
ObservableCollection
(例如在ListView
示例中),您可以在调用ObservableCollection
的Add()
或Remove()
函数时更新UI,但是 * 当您更改ObservableCollection
引用本身时 * 则不会发生这种情况。原因是ObservableCollection
实现了INotifyPropertyChanged
,它告诉绑定在您更改集合中的项集时进行更新。以下不会自动工作:要实现这一点,您需要在
MyPage
上实现INotifyPropertyChanged
。这需要三个步骤(听起来可能有点吓人,但对任何属性都是一样的):1.实作界面
INotifyPropertyChanged
。1.添加
PropertyChanged
事件。1.修改
MyShape
setter以引发PropertyChanged
事件。实作界面
INotifyPropertyChanged
。添加
PropertyChanged
事件。修改
MyShape
setter以引发PropertyChanged
事件。最终的C#代码将如下所示:
现在,您的
ContentControl
将按预期使用不同的BindingMode
值(OneTime
、OneWay
和TwoWay
)工作。如果希望在更改形状的属性时更新
ContentControl
内的绑定控件,例如在更改形状的属性时更新<TextBlock Text="{x:Bind Name}">
:您可以使用相同的基本步骤在
Shape
类本身上实现INotifyPropertyChanged
。无论您使用的是ContentControl
、GridView
、ListView
还是任何其他数据绑定控件,这都是相同的。基本上,每个您希望能够更新其属性并更新数据绑定UI的层,您需要这样做。无论您使用了此答案中的两种方法中的哪一种,都需要这样做。您可以参考my answer here了解有关此方面的详细信息。