【发布时间】:2016-09-24 00:05:34
【问题描述】:
我有一个 ViewModel 的 ObservableCollection,我想将其绑定到包含相关子视图的 ItemsControl。当我将 ViewModel 添加到我的集合中时,会在 ItemsControl 中生成适当数量的子视图。但是,每个生成的视图的 DataContext 都是空的。如果我内联我的子视图,它可以正常工作。那么,我需要怎么做才能将我的子视图的 DataContext 设置为我的 ViewModel?
这是我的父 ViewModel 中的相关位:
public ObservableCollection<ChildViewModel> Numbers { get; set; }
public ParentViewModel()
{
Numbers = new ObservableCollection<ChildViewModel>();
}
private void ShowNumbers()
{
foreach (var num in Enumerable.Range(0, number))
{
var childView = new ChildViewModel(number.ToString());
Numbers.Add(childView);
}
}
父视图中的相关位:
<ItemsControl ItemsSource="{Binding Numbers, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type vm:ChildViewModel}">
<v:ChildView />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
子视图:
<UserControl x:Class="TestWpfApp.Views.ChildView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
prism:ViewModelLocator.AutoWireViewModel="True">
<Grid>
<Label Content="{Binding NumberString}" Width="30" Height="30" BorderThickness="1" BorderBrush="Black" HorizontalAlignment="Center"/>
</Grid>
</UserControl>
子视图模型:
public class ChildViewModel : BindableBase
{
private string numberString;
public string NumberString
{
get
{
return numberString;
}
set
{
SetProperty(ref numberString, value);
}
}
public ChildViewModel() { }
public ChildViewModel(string number)
{
NumberString = number;
}
}
显然,我有一些错误配置,但我终生无法弄清楚是什么。
仅供参考,我正在使用 Prism 库
【问题讨论】:
-
我猜你不应该设置
prism:ViewModelLocator.AutoWireViewModel,因为 WPF 已经负责设置 ItemsControl 中项目容器的属性 DataContext。另请参阅:stackoverflow.com/q/33043978/1136211 -
DataContext是否设置为您的ViewModel?或者只是DataTemplate's不能应用?只需创建一些string属性并绑定你的View来测试你的DataContext是否已设置。 -
好吧@Clemens,你说得对。删除那行代码使一切正常。如果您将其作为答案提交,我希望将其设为可接受的解决方案。
标签: c# wpf mvvm datacontext itemscontrol