C# 表达式混合不';无法识别代码隐藏文件中声明的命令对象

C# 表达式混合不';无法识别代码隐藏文件中声明的命令对象,c#,wpf,visual-studio-2008,expression-blend,C#,Wpf,Visual Studio 2008,Expression Blend,我有一个WPF用户控件。代码隐藏文件声明了一些在XAML中引用的RoutedUICommand对象。该应用程序构建并运行良好。但是,Expression Blend 3无法在设计器中加载XAML,并出现如下错误: 成员“ResetCameraCommand”不可用 可识别的或可接近的 该类和成员都是公共的。在Blend中构建和重建项目并重新启动Blend没有任何帮助。你知道问题出在哪里吗 这里是我的XAML的片段 <UserControl x:Class="CAP.Visual.Camer

我有一个WPF用户控件。代码隐藏文件声明了一些在XAML中引用的RoutedUICommand对象。该应用程序构建并运行良好。但是,Expression Blend 3无法在设计器中加载XAML,并出现如下错误:

成员“ResetCameraCommand”不可用 可识别的或可接近的

该类和成员都是公共的。在Blend中构建和重建项目并重新启动Blend没有任何帮助。你知道问题出在哪里吗

这里是我的XAML的片段

<UserControl x:Class="CAP.Visual.CameraAndLightingControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CAP.Visual;assembly=VisualApp"
Height="100" Width="700">   
    <UserControl.CommandBindings>
        <CommandBinding Command="local:CameraAndLightingControl.ResetCameraCommand" Executed="ResetCamera_Executed" CanExecute="ResetCamera_CanExecute"/>
    </UserControl.CommandBindings>
    ....

您是否复制并粘贴了错误?如果是这样的话,那么看起来你在某个地方输入了错别字。您的代码隐藏和XAML具有ResetCameraCommand(命令中有两个m),错误消息显示ResetCameraCommand(命令中有一个m)。

Expression Blend不会加载代码隐藏。它实际上只是加载XAML。您始终可以在XAML中的UserControl.Resources中创建命令对象。如果您在代码隐藏中创建了一些东西,并且XAML引用了它,Expression Blend将无法找到它,因为它只是解析XAML

在你说混合被破坏之前,这是故意的。命令和类似项应该封装在设计/布局逻辑中,该逻辑应该在XAML中。如果您有自定义命令或自定义操作,那么在XAML中使用它们仍然非常容易

以下是我为我的应用程序所做的: 我在MyApp.Commands命名空间中有一个名为Command.cs的C#class文件

public static class AppCommands
{
    public static RoutedCommand SendData { get { return _sendDataCommand; } }

    private static RoutedCommand _sendDataCommand = new RoutedCommand
    (
        "Send Data",
        typeof(AppCommands),
        new InputGestureCollection()
        {
            new KeyGesture(Key.N, ModifierKeys.Alt)
        }
    )
}
那么您的XAML将包括

<UserControl x:Class="MyApp.Window"
    xmlns:c="clr-namespace:TBL.SFDC.Commands">
    <UserControl.Resources>
        <CommandBinding Command="c:AppCommands.SendData" Executed="SendData_Executed" CanExecute="SendData_CanExecute" />
    <UserControl.Resources>
</UserControl>


在许多情况下,您必须在BLEND中编译解决方案,以使其能够识别类中的属性等。我遇到了同样的问题,只有当一位同事提醒我用Blend重新编译时,我才让它工作。

不,我没有复制并粘贴错误。(Blend不允许您选择或复制错误文本,因此这是我发布此错误时的一个输入错误。)C#或XAML代码中没有输入错误:该应用程序在Visual Studio中正确编译和运行。启动赏金!趁热去拿!谢谢你的回答,看起来很有希望。但对于我来说,Blend能够使用在不同类中定义的静态命令,而不是在代码隐藏类中定义的静态命令,这似乎有点奇怪。我一有机会就会尝试并接受!已编译在不同类中定义的静态命令。当您使用代码隐藏时,Blend将加载XAML并可以细化预编译项。它只是(很奇怪)不会加载后面的代码。至少对我来说是这样的。
<UserControl x:Class="MyApp.Window"
    xmlns:c="clr-namespace:TBL.SFDC.Commands">
    <UserControl.Resources>
        <CommandBinding Command="c:AppCommands.SendData" Executed="SendData_Executed" CanExecute="SendData_CanExecute" />
    <UserControl.Resources>
</UserControl>