在设计时确定 WPF 控件的 DataContext

9

如何在WPF应用程序的设计时确定特定控件的DataContext?

DataContext可能被特定地设置在XAML中,继承或在代码中某处设置,有时很难在设计时弄清楚绑定指向哪个类。

我通常尝试查找VS中的绑定名称来找到DataContext类。例如,我看到绑定是像下面这样的:

ItemSource = {Binding Items}

我将搜索文本“Items”以找到该类,但是VS有时无法找到所搜索的文本(解决方案中有多个项目)。

(我会搜索文本“Items”来找到这个类,但是在解决方案中有多个项目时,VS有时无法找到所搜索的文本。)


1
我认为这个问题没有明确的答案,因为在设计时它是未知的。运行时的几个选项是:a)设置无效绑定并检查输出 - 它可能会给出错误,说找不到对象<name>上的属性;b)添加类似<TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Path=DataContext}"/>的内容,但如果没有关联DataTemplate,则只会显示类名;或者c)通过搜索View类名的较长方式来查看它是如何初始化的。 - Tone
2个回答

6

我可以为StepUp的列表添加一种方法:

设计实例:

就像您可以定义运行时数据上下文一样,您可以通过以下方式添加一个专门用于设计时间的数据上下文:

    <Usercontrol    x:Class="MyUserControl"  
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    xmlns:viewModels="clr-namespace:MyProject.ViewModels"
                    d:DataContext="{d:DesignInstance viewModels:MyViewModel}"
                    d:DesignHeight="300"
                    d:DesignWidth="600"
                    mc:Ignorable="d">
    </UserControl>

在Visual Studio中,您可以使用IntelliSense来绑定属性。如果您的视图模型具有简单或无参数的构造函数,则它将在设计器中创建,并且您可以测试触发器或转换器,而无需启动应用程序。请注意保留HTML标记。

3
ControlDataContextViewModel。有许多方法可以为ViewDataContext设置ViewModel,如果您找到了ViewModel,但是在其中没有Items属性,则说明应该添加此属性以进行工作绑定。
此外,我建议您查看Debug-> Windows-> Output窗口,您可以在那里查看绑定信息,从而了解绑定错误。
最后,我想展示设置ViewModelDataContext的方法:
有许多方法可以设置DataContext: 第一种方法。在视图中:
<Window.DataContext>
   <local:MainWindowViewModel/>
</Window.DataContext>

第二种方法。您应该覆盖App.xaml.cs文件中的OnStartUp()方法。
public partial class App : Application
{
     protected override void OnStartup(StartupEventArgs e)
    {
            base.OnStartup(e);
            MainWindow app = new MainWindow();
            ProductViewModel context = new ProductViewModel();
            app.DataContext = context;
            app.Show();
     }
}

第三种方法。 在Windows的构造函数中:

public partial class MainWindow : Window
{
     public MainWindow()
     {
          InitializeComponent();
          DataContext=new MainWindowViewModel();
     }
}
第四种方法。您可以通过UnityContainer或其他IoC容器的DependencyInjection来设置DataContext。但是,DependencyInjectionPrismUnityContainer是不同的问题,并且超出了本问题的范围。仅以此作为例子:
protected override void RegisterTypes()
{ 
    unityContainer.RegisterType<object, ItemControl>("ModuleAUpper");
    unityContainer.RegisterType<IViewModelItemControl, ViewModelItemControl>();
    unityContainer.RegisterTypeForNavigation<ItemControl>();
}

调试->窗口->输出可能是可行的解决方案。我知道设置DataContext的方法(这里是由其他开发人员设置的,我只想找出最简单的方法)。 - Nuts
@user2143213 请随意提出任何问题。如果您觉得我的回答对您有帮助,那么您可以将我的回答标记为答案,以简化其他人未来的搜索。请阅读此链接:http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - StepUp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接