我在Visual Studio 2012中使用WPF + XAML + MVVM时遇到此错误。
解决办法是什么?
最佳答案
ReSharper在为WPF设计XAML时会产生此错误,并且指示XAML找不到包含运行时绑定(bind)的类。这通常表明DataContext
设置不正确。
此错误意味着:
binding
从XAML自动导航到C#类。 对于那些在MVVM中思考的人来说,该错误表明View无法找到ViewModel。
解决方案1
浏览某种Web教程,以了解DataBinding的工作方式。推荐Microsoft Data Binding Overview。
解决方案2
如果使用ReSharper,请在有问题的DataContext上按Alt-Enter,将弹出一个菜单,可帮助您将正确的DataContext插入XAML。
我用它来正确解决问题。
解决方案3
在Visual Studio的“属性” Pane 中,可以选择所选控件的数据上下文:
解决方案4
Blend也可以用于设置数据上下文。在Blend中打开.sln文件,选择设计元素,然后在属性中选择“新建”:
解决方案5
DevExpress还可以使用其向导帮助您解决XAML中的此错误。
在XAML中,选择要为其设置数据上下文的父元素(通常是整个表单),然后在设计器中选择操作三角形。
然后,使用C#代码浏览到该类。
提示:除非您向该类添加无参数构造函数,否则该类将是不可见的。
之前的XAML
<UserControl x:Class="DemoAllocation.MyActualView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
XAML之后<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:Implementation="clr-namespace:DemoAllocation.ViewModel.Implementation" x:Class="DemoAllocation.MyActualView"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.DataContext>
<Implementation:MyActualViewModel/>
</UserControl.DataContext>
提示6如果在WPF设计器上看不到智能标记,请检查它们是否在某些时候没有关闭:
解决方案7
您可以添加一个snippet of code on startup调用,每次出现绑定(bind)错误时,该对话框就会弹出一个消息框。事实证明这非常有用。
如果上述Web链接断开,则代码如下:
public partial class Window1 : Window
{
public Window1()
{
BindingErrorTraceListener.SetTrace();
InitializeComponent();
}
}
方法:using System.Diagnostics;
using System.Text;
using System.Windows;
namespace SOTC_BindingErrorTracer
{
public class BindingErrorTraceListener : DefaultTraceListener
{
private static BindingErrorTraceListener _Listener;
public static void SetTrace()
{ SetTrace(SourceLevels.Error, TraceOptions.None); }
public static void SetTrace(SourceLevels level, TraceOptions options)
{
if (_Listener == null)
{
_Listener = new BindingErrorTraceListener();
PresentationTraceSources.DataBindingSource.Listeners.Add(_Listener);
}
_Listener.TraceOutputOptions = options;
PresentationTraceSources.DataBindingSource.Switch.Level = level;
}
public static void CloseTrace()
{
if (_Listener == null)
{ return; }
_Listener.Flush();
_Listener.Close();
PresentationTraceSources.DataBindingSource.Listeners.Remove(_Listener);
_Listener = null;
}
private StringBuilder _Message = new StringBuilder();
private BindingErrorTraceListener()
{ }
public override void Write(string message)
{ _Message.Append(message); }
public override void WriteLine(string message)
{
_Message.Append(message);
var final = _Message.ToString();
_Message.Length = 0;
MessageBox.Show(final, "Binding Error", MessageBoxButton.OK,
MessageBoxImage.Error);
}
}
}
解决方案8使用免费的实用程序Snoop。
有一个非常好的功能,允许您按具有绑定(bind)错误的控件进行过滤。这使您可以直接导航到具有绑定(bind)错误的视觉效果。
启动Snoop之后:
提示9-设计时DataContext
实际上有两个完全独立的DataContext:
design time
和run time
。以前的大多数解决方案都专注于设置
run time
DataContext。设置
design time
DataContext后,Visual Studio或Blend中的XAML预览将显示由自定义C#类提供的自定义数据。如果使用Blend,则也可以从XML文件读取此自定义数据,但是我更喜欢从我自己的C#类提供它。
要设置
design time
DataContext,请参见:或者,将其添加到任何元素中(这将在设计时更新
MyClass
类,因此Intellisense将起作用):d:DataContext="{d:DesignInstance d:Type=viewModel:MyClass, IsDesignTimeCreatable=True}"
这是标题:xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
在后台,当您设置design time
DataContext时:请注意,只有在使用用户控件时,才会显示XAML预览。如果您更喜欢使用DataTemplates,那么没问题:您可以创建一个包含DataTemplate的临时用户控件,并将
design time
DataContext设置为指向静态类。编写静态类的代码,以便它创建ViewModel的新实例(即您要绑定(bind)到的类)。例如,您的静态类可以从数据库读取数据,填充ViewModel的属性,并且可以在XAML设计时使用数据库中的实时数据。该技术还可以与依赖注入(inject)(例如Unity或MEF)完美配合。您必须将
design time
DataContext指向一个静态类,该类将从依赖项注入(inject)容器中获取适当的类,并进行所有设置。然后,您可以在设计时在XAML预览中查看实时数据。上面的链接演示了它是如何工作的(完整的YouTube视频是XAML设计时的实时滴答时钟!)。毋庸置疑,该技术与MVVM模式以及MVVM +依赖项注入(inject)完美配合。对于不熟悉MVVM的人来说,这是产生优雅,干净,可维护且易于更改的项目的好方法。 Microsoft Blend本身完全使用MVVM模式编写。
关于c# - ReSharper WPF错误: “Cannot resolve symbol ” MyVariable“due to unknown DataContext”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25549826/