62672


VidualStudio2017にて、あるXamlをデザインビューで表示しようとしたところ、「アサートに失敗しました」ポップアップが表示されました。  
追ってみると、あるメソッドにてDebug.Assertをしている箇所にてエラーが起きているようです。  
ただXamlを開いただけなのに、実際のロジックが走るものなのでしょうか。


CC BY-SA 4.0
2020-01-29T03:42:39.737
62624
2020-01-31T05:12:19.480
32228
question
c# visual-studio xaml
VisualStudio2017のデザインビューの仕組みについて


実際のロジックが走ります。

Xamlの場合、[`DesignerProperties.IsInDesignMode`添付プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.componentmodel.designerproperties.isindesignmode?view=netframework-4.8#System_ComponentModel_DesignerProperties_IsInDesignMode)を使うことで、デザインモードで実行されているか判定できるため、これで処理を分岐することを検討してください。

WinFormsでも同様でこちらは[`Component.DesignMode`プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.componentmodel.component.designmode?view=netframework-4.8)で判定できるようになっています。またASP.NETの場合、Webですから実行時にはHTMLが生成されるわけですが、こちらもデザインモードではそれ用に別途UI表示できるようになっています。この際も[`Control.DesignMode`プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.web.ui.control.designmode?view=netframework-4.8#System_Web_UI_Control_DesignMode)で判定することになります。


CC BY-SA 4.0
2020-01-30T22:51:32.110
62672
2020-01-30T22:51:32.110
4236
62624
answer


DataContext がエラーを吐いているということを前提として書きます。

ちょっと試してみましたが、

[code]

    <Window x:Class="xxx.MainWindow"
            d:DataContext="..."
            ...>
        <Window.DataContext>
            <local:MyDataContext/>
        </Window.DataContext>
        ...
    </Window>
    
[/code]

のように初期化すると DesignInstance を設定していても `MyDataContext` のコンストラクタは呼ばれるようです。

一方コードビハインドで

[code]

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MyDataContext();
        }
    }
    
[/code]

と初期化する場合はこの部分の処理は行われませんでした。

コンストラクタではなくプロパティ経由でエラーとなっている場合は DesignInstance
を設定すれば回避できます。同じプロパティを持つダミーを指定してください。

[code]

    <Window x:Class="xxx.MainWindow"
            ...
            mc:Ignorable="d"
            d:DataContext="{d:DesignInstance Type=local:FakeDataContext, IsDesignTimeCreatable=True}"         >
        <Window.DataContext>
            <local:RealDataContext/>
        </Window.DataContext>
        ...
    </Window>
    
[/code]

また、`Debug.Assert` ではなく単に例外を投げた場合、xamlデザイナに波線は表示されますが、ダイアログが表示されることはありません。


CC BY-SA 4.0
2020-01-31T05:12:19.480
62677
2020-01-31T05:12:19.480
20885
62624
answer