gpt4 book ai didi

c# - 在 ItemsControl 中使用 View 作为 DataTemplate 时未设置 DataContext

转载 作者:行者123 更新时间:2023-11-30 16:02:35 24 4
gpt4 key购买 nike

我有一个 ViewModel 的 ObservableCollection,我想将其绑定(bind)到包含关联 subview 的 ItemsControl。当我将 ViewModel 添加到我的集合时,会在 ItemsControl 中生成适当数量的 subview 。但是,每个生成的 View 的 DataContext 都是空的。如果我内联我的 subview ,它会正常工作。那么,我需要做什么才能将我的 subview 的 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);
}
}

来自父 View 的相关位:

        <ItemsControl ItemsSource="{Binding Numbers, UpdateSourceTrigger=PropertyChanged}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type vm:ChildViewModel}">
<v:ChildView />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>

subview :

<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>

subview 模型:

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 库

最佳答案

WPF 自动将 ItemsControl 中的项容器元素的 DataContext 设置为适当的项实例,以便它可以继承到 ItemTemplate。显然,当您设置 prism:ViewModelLocator.AutoWireViewModel 属性时,此机制被禁用。

因此,只需将它从您的 ChildView 的 XAML 中删除:

<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/">
<Grid>
<Label Content="{Binding NumberString}" Width="30" Height="30"
BorderThickness="1" BorderBrush="Black" HorizontalAlignment="Center" />
</Grid>
</UserControl>

作为一般规则,UserControl 永远不应显式设置自己的 DataContext,无论是直接设置还是通过类似 AutoWireViewModel 的机制,因为这会有效地阻止继承 来自其父控件的 DataContext

关于c# - 在 ItemsControl 中使用 View 作为 DataTemplate 时未设置 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37453162/

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