5

VS2013 で利用できる新しい xaml 編集機能に関する次のブログ記事を読みました。

http://blogs.msdn.com/b/visualstudio/archive/2013/08/09/xaml-editor-improvements-in-visual-studio-2013.aspx

データ バインディングの Intellisense は、私が長年求めていたものなので、試してみましたが、残念ながらエラー リストにエラーが返されます (ただし、ビルドは正常に行われます)。

これは、UserControl 宣言/タグに追加したものです。

d:DataContext="{d:DesignInstance Type=lTemplates:TemplateEditorCustomVM}"

これはリストのエラーです:

エラー 95 アクセスが拒否されました:System.Collections.ObjectModel.ObservableCollection'1[_.di1.TemplateEditorCustomVM+TemplateCriteriaVM]'.

何をしようとしているのか完全にはわかりません。両方のクラスがパブリックとして宣言されています (メイン ビュー モデルとネストされたクラス)。

誰でもアイデアはありますか?

そうでない場合でも、リソース キー インテリセンスが機能しているように見えるので、それは世界の終わりではありません。これは依然として大きなボーナスです。

編集

OK - ネストされたクラスを public 名前空間に移動したところ、VS からより詳細なエラーが表示されました。

エラー 64 Attempt by method '_.di1.Templates.TemplateEditorCustomVM..ctor()' to access method 'System.ComponentModel.BindingList'1<System.__Canon>..ctor()'が失敗しました。

私は少し混乱しています。

まず、インテリセンスが VM クラスをインスタンス化する必要があるのはなぜですか。それが気にする必要があるのは、使用可能なプロパティとその型だけです。これらはすべてリフレクションで取得できます。

第二に、アプリケーションの起動時に正常に実行されたときにエラーが発生する理由がわかりません。

デザイナーが何をしようとしているのかを確認するために、Visual Studio 自体をデバッグしてデザイナーを実行するという古いトリックを実行する必要があるかもしれません...

さらに編集

そうです、BindingList プロパティを単純な List プロパティに変更しました (BindingList は WinForms 側のものであるため、これが何をするかを確認するために変更する価値があると思いました)。しかし、同様のエラーが発生しました:

エラー 64 Attempt by method '_.di3.Templates.TemplateEditorCustomVM..ctor()' to access method 'System.Collections.Generic.List'1<System.__Canon>..ctor()' failed.

System.__Canon で簡単にグーグルで検索しましたが、最適化の詳細は次のとおりです。

https://stackoverflow.com/a/16856205/182568

何が起こっているのかを突き止めるにはまだ近づいていませんが、まあ、私はさらに掘り下げ続けます.

編集 - レポができました

そうです、好奇心からこの問題を突き止めようと、VM の巨大なチャンクをコメントアウトし始めました。そして、問題を再現しているように見える VM クラスができました。

public class Nested
{
    public class TestCheck
    {
        public int One { get; set; }
        public int Two { get; set; }
    }
}

public class SanityTestVM
{
    public List<Nested.TestCheck> Test { get; set; }
} 

与えます:

エラー 14 メソッドによる試行'_.di14.Templates.SanityTestVM..ctor()' to access method 'System.Collections.Generic.List'1<System.__Canon>..ctor()' failed.

問題は、そのタイプのネストされたクラスを持つリストを持っているようです-通常のクラス(ネストされていない)の場合、すべて問題ありません。

これについては接続ケースを提出する必要があると思います-誰かがこれを確認できるようにする前に、Windows 8.1 マシンに 4 つのバージョンの VS があり、開発環境を除外したいだけです。

4

4 に答える 4

2

これは確かに VS2013 のバグのようです。数人の同僚に再現できるかどうかを尋ねたところ、私の環境だけではありません。

私は接続ケースを送信しました。他の誰かがこのエラーに遭遇した場合は、自由に投票してください。

https://connect.microsoft.com/VisualStudio/feedback/details/808323/

この問題は、ネストされたクラス型を含むジェネリック定義を持つプロパティを含むビュー モデルがあることが原因で発生します。

public class AClass
{
    public class AnotherClass
    {
        public int AProperty { get; set; }
    }
}

class TestVM
{
    public List<AClass.AnotherClass> NestedTypeList { get; set; }
}

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        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:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance Type=local:TestVM}"
        Title="MainWindow" Height="354" Width="535">
    <Grid>
    </Grid>
</Window>

与えます:

Error 1 Attempt by method '_.di1.WpfApplication1.TestVM..ctor()' to access method 'System.Collections.Generic.List'1<System.__Canon>..ctor()' failed.

于 2013-11-12T10:57:42.873 に答える
0

「Type=lTemplates:TemplateEditorCustomVM」は必要ないと思います。XAML ページからこのように MVVM と datacontext を使用します。

<Page.DataContext>
    <Binding Mode="OneWay" Path="YourProperty" Source="{StaticResource ViewModelLocator}"/>
</Page.DataContext>

次に、App.xaml には、任意のページから参照できる静的リソースがあります。

 <locator:ViewModelLocator p6:Key="ViewModelLocator" xmlns:p6="http://schemas.microsoft.com/winfx/2006/xaml"/>

この方法で DesignTimeData を読み込むことをお勧めします。デザイナーに表示する設計時のデータをより細かく制御できます。

Expression Blend でデザイン時のデータを使用して CollectionViewSource を使用する方法は?

それが役に立てば幸い。

于 2013-11-09T09:04:02.867 に答える
0

デザイナはデフォルトでコンストラクタを開始しようとしています。これはおそらく、VM の作成者やその他のエンティティが設計時にテスト データを開始できるようにするために行われます。それ以外の場合、通常、すべての文字列は空で、ほとんどの数値はゼロです。

あなたの場合、内部プロパティの 1 つが初期化されておらず (null)、バインディングがプロパティの内部メンバーにアクセスしようとしているようです。

あなたが興味を持っているのが単なる知性であり、「実際の」データを持つデザイナーが必要ない場合は、次を使用できます。

d:DataContext="{d:DesignInstance Type=lTemplates:TemplateEditorCustomVM
                                 IsDesignTimeCreatable=False}"

上記の解決策を回避し、設計時にいくつかのテスト データが必要な場合は、クラスのコンストラクターで次のように指定できます。

if(DesignerProperties.GetIsInDesignMode(new DependencyObject()))
  {
      FillDummyData();
  }
于 2013-11-11T22:09:06.393 に答える