1

ViewModelLocator を App.xaml のリソースとして宣言して使用しようとしています。次のような非常に単純なクラスです。

public class ViewModelLocator
    {
        public ShellViewModel ShellPage
        {
            get
            {
                return new ShellViewModel();
            }
        }
}

App.xaml ファイルは次のとおりです。

<Application x:Class="SomeNamespace.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:SomeNamespace.ViewModels">
    <Application.Resources>
         <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </Application.Resources>
</Application>

App.xaml.cs は次のとおりです。

public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            var view = new ShellView();
            Current.MainWindow = view;
            Current.MainWindow.Show();            
        }
    }

ShellView.xaml は以下のとおりです。

<Window 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="SomeNamespace.ShellView"
        Title="MainWindow" 
        Height="350" 
        Width="525" 
        ResizeMode="NoResize" 
        MinWidth="700" 
        MinHeight="700"
        DataContext="{Binding ShellPage, Source={StaticResource ViewModelLocator}}"
        >
    <Grid>
        <TextBlock Text="{Binding Title}"></TextBlock>
    </Grid>
</Window>

Visual Studio デザイナーで正しいタイトルを確認できますが、アプリを実行すると XamlParseException: 'Provide value on 'System.Windows.StaticResourceExtension' throw an exception.' が発生します。行番号 '11' および行位置 '9'。

内部例外には{"'ViewModelLocator' という名前のリソースが見つかりません。リソース名は大文字と小文字が区別されます。"}

何か足りないのですか?

4

4 に答える 4

5

ResourceDictionary の中に入れてみてください

<Application.Resources>
    <ResourceDictionary>
        <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </ResourceDictionary>
</Application.Resources>

編集:

OnStartup をオーバーライドする代わりに、アプリで Startup イベントを使用して問題を解決しました。

<Application x:Class="TestWPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:vm="clr-namespace:TestWPF.ViewModels"
             Startup="App_Startup">
    <Application.Resources>
          <vm:ViewModelLocator x:Key="ViewModelLocator" />
    </Application.Resources>
</Application>

コード

public partial class App : Application
{
    void App_Startup(object sender, StartupEventArgs e)
    {
        var view = new ShellView();
        Current.MainWindow = view;
        Current.MainWindow.Show();
    }
}
于 2013-09-25T18:55:38.443 に答える
0

解決策を見つけたようです。その理由は、App.xaml.

1. .Such のデフォルトの StartUrl を次のApp.xamlように削除します。

        <Application x:Class="BidingAccessories.App" 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" d1p1:Ignorable="d"
                     xmlns:d1p1="http://schemas.openxmlformats.org/markup-compatibility/2006">
            <Application.Resources>
                <ResourceDictionary>
                    <vm:ViewModelLocator x:Key="Locator" xmlns:vm="clr-namespace:BidingAccessories.ViewModel" />
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary Source="pack://application:,,,/BidingCommon;component/CommonStyleDictionary.xaml" />
                    </ResourceDictionary.MergedDictionaries>
                </ResourceDictionary>
            </Application.Resources>
        </Application>
        </Application.Resources>
        </Application>

2. OnstartUp イベントをオーバーライドしますApp.xaml.cs

    protected override void OnStartup(StartupEventArgs e)
        {
            StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
    }
于 2017-09-04T10:28:07.260 に答える
0

起動時にウィンドウをロードしていますが、ウィンドウが依存する両方のアプリでリソースがまだ完全に解決されていないため、これは私の意見では良い方法ではありません。設計時にプロパティの読み込みが見られる場合でも、これは必ずしも良い議論ではありませんが、設計は別のロジックに従ってコードを実行します。
アプリと Windows をロードしてから、ウィンドウのグリッドにコンテキスト プロパティを入力する必要があります。


リソース XAML を App.xaml から削除し (実際には範囲外に見えます)、代わりに次のようにします。

 <Window.Resources>
        <wpfApplication1:ViewModelLocator x:Key="ViewModelLocator" />
    </Window.Resources>

    <Grid   DataContext="{Binding ShellPage, Source={StaticResource ViewModelLocator}}">
        <TextBlock Text="{Binding Title}"></TextBlock>
    </Grid>
于 2013-09-25T19:31:29.933 に答える