1

以前の仕事ではこれを行っていましたが、そこでは完璧に機能していましたが、何らかの理由で今は機能しません。

ObjectDataProvider を使用して XAML で ViewModel クラスのインスタンスを作成し、それをバインディング用に参照できるようにしたいだけです。また、DataContext を Window で ViewModel に設定し、xmlns:local を取得しました。すべての ViewModel と同じ名前空間を持つ完全修飾名。

<Window 
x:Class="TimersXP.TimersHost"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:local="clr-namespace:TimersXP.ViewModels"
Name="TimersHostView"
SizeToContent="Height"
Title="TimersXP"
WindowStartupLocation="CenterScreen"
WindowStyle="ToolWindow"
DataContext="TimersHostViewModel">
<Window.Resources>
    <ObjectDataProvider x:Key="TimersHostViewModel" ObjectInstance="{x:Type local:TimersHostViewModel}"/>
</Window.Resources>

その後、ViewModelを使用しようとしました:

<Grid.ContextMenu>
        <ContextMenu ItemsSource="{Binding Source={StaticResource TimersHostViewModel}, Path=Skins}" Style="{DynamicResource styleBanner}"/>
</Grid.ContextMenu>

しかし、私の問題は、TimersHostViewModel パラメーターなしのコンストラクターでブレーク ポイントを設定すると、デバッグ時にヒットしないことです。そのため、ObjectDataProvider が正しく機能していないようです。ウィンドウは作成されますが。

App.xaml.cs と MainWindow.xaml.cs のブレーク ポイントがヒットし、InitializeComponent もヒットし、さらにシングルトン モデル クラスが作成されていることがわかります。しかし、私の TimersHostViewModel クラス コンストラクターが呼び出されない理由を理解することはできません。

私が覚えていることの 1 つは、私の仕事で次のような行を使用したことです。

ObjectInstance がなく、ObjectType しかないことがわかります。そのため、ObjectInstance を削除して代わりに ObjectType を設定しようとすると、次のエラーが発生します: オブジェクト参照がオブジェクトのインスタンスに設定されていません。 {x:Type local:TimersHostViewModel}"...何を与える?! あるインスタンスでは機能し、別のインスタンスでは機能しないのはなぜですか? 私はそれについて非常に混乱しています。

編集:わかりました、私は自分の質問に部分的に答えることができましたが、本当の質問はまだ残っています. そのため、ウィンドウの DataContext を削除し、ObjectDataProvider ObjectInstance を ObjectType に変更することで、ViewModel コンストラクターを呼び出すことができました。次に、Grid DataContext を設定して、TimersHostViewModel にバインドします。しかし、それでも ObjectDataProvider ObjectType: Object reference not set to an object のこのデザイン時/コンパイル時のエラーが残っています。

<Window 
x:Class="TimersXP.TimersHost"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:local="clr-namespace:TimersXP.ViewModels"
Name="TimersHostView"
SizeToContent="Height"
Title="TimersXP"
WindowStartupLocation="CenterScreen"
WindowStyle="ToolWindow">
<Window.Resources>
    <ObjectDataProvider x:Key="TimersHostViewModel" ObjectType="{x:Type local:TimersHostViewModel}"/>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource TimersHostViewModel}}">

また、現在使用しているような特定の状況では機能するのに、他の状況では機能しない理由もまだわかりません。

完全なソース コードはこちら: http://timersxp.codeplex.com/SourceControl/latest#VS2013/TimersXP/Views/TimersHost.xaml

4

1 に答える 1