【问题标题】:What do I need to further qualify the DataContext for a binding?我需要什么来进一步限定 DataContext 以进行绑定?
【发布时间】:2013-02-12 15:30:57
【问题描述】:

我已创建并将在此问题中引用的文件是:

TechnicainSelectionView.xaml
TechnicianSelectionView.cs
TechnicianSelectionViewModel.cs
Technician.cs (Code First Entity)

我的 TechnicanSelectionView.xaml 中有以下 xaml

<UserControl xmlns etc... here" 
             d:DesignHeight="48" d:DesignWidth="300">
    <Grid>
        <StackPanel>
            <Label Content="Select a Technican to run the test" FontWeight="Bold"></Label>
            <ComboBox ItemsSource="{Binding Technicians, Mode=TwoWay}"></ComboBox>
        </StackPanel>
    </Grid>
</UserControl>

ItemSource 设置绑定到的 Technicians 属性声明它Cannot resolve Technicians due to an unknown DataContext.

如果我们查看我的 TechnicianSelectionView.cs 代码隐藏...

public partial class TechnicianSelectionView : UserControl
{
    public TechnicianSelectionViewModel ViewModel { get; private set; }

    public TechnicianSelectionView()
    {
        InitializeComponent();

        Technician.GenerateSeedData();

        ViewModel = new TechnicianSelectionViewModel();
        DataContext = ViewModel;
    }
}

...我们看到我正在将视图的 DataContext 设置为我的 TechnicianSelectionViewModel ...

public class TechnicianSelectionViewModel : ViewModelBase
{
    public ObservableCollection<Technician> Technicians { get; set; }

    public TechnicianSelectionViewModel()
    {
        Technicians = new ObservableCollection<Technician>();
    }

    public bool IsLoaded { get; private set; }

    public void LoadTechnicians()
    {
        List<Technician> technicians;

        using (var db = new TestContext())
        {
            var query = from tech in db.Technicians
                        select tech;

            foreach (var technician in query)
            {
                Technicians.Add(technician);
            }
        }

        IsLoaded = true;
    }
}

技术人员是我的 ViewModel 上的一个属性...

既然已经为视图设置了 DataContext,为什么它不能将 ViewModel 上的 Technicians 解析为要绑定到的 DataContext/属性?

编辑:

根据下面评论中的问题。这是设计时问题,而不是编译时问题。我应该在一开始就指出这一点。

【问题讨论】:

标签: c# wpf data-binding mvvm


【解决方案1】:

您需要在 xaml 中指定数据上下文的类型以获得设计时支持。即使您在代码隐藏中分配了数据上下文,设计人员也不会认识到这一点。

尝试将以下内容放入您的 xaml:

d:DataContext="{d:DesignInstance vm:TechnicianSelectionViewModel}"

更多详情请见this link

【讨论】:

  • 这是设计时问题吗?我在原始问题中没有看到任何地方提到它是设计时绑定错误。
  • 没有具体提到,但是我在设计时经常看到这个错误信息,所以我假设他指的是这个。此外,他说“将要绑定到?”,这对我来说听起来像是设计时间,因为听起来应用程序还没有运行。
  • @BrentStewart 这确实是一个设计时间问题。我没有提到这一点。我会相应地更新。
  • @Brandon 谢谢你的帮助,布兰登。那肯定奏效了。也感谢您研究这篇文章。
  • 没问题。还值得注意的是,尽管出现警告消息,您的应用程序可能会完美运行。我很少指定我的 DataContext 类型,并且一切都在运行时很好地结合在一起。大多数时候我只是忽略这个警告。
【解决方案2】:

在我的 Xamarin Forms Xaml 文件中,我在标题(ContentPage 标记)中使用了以下几行,它可以按我的意愿完美运行。

基本上现在

  • 智能感知显示绑定中的字段
  • 如果我重构属性的名称,我的 Resharper 能够重命名 Xaml 文件中的绑定

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:vm="clr-namespace:YourApplicationName.ViewModels;assembly=YourApplicationName"
    mc:Ignorable="d"
    d:DataContext="{d:DesignInstance {x:Type vm:CurrentPageViewModel}}"
    

【讨论】:

    猜你喜欢
    • 2014-07-20
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    相关资源
    最近更新 更多