3

私は現在、Microsoft virtual academy の Windows Phone チュートリアルに従っています。課題の 1 つは、プロジェクトで作成され、実行時に読み込まれるデザイン xaml ビューモデルを使用することでした。

これを何時間も調査した後、どこにも行けないので、スタックオーバーフローに頼る時が来たと思いました。私は数多くの記事を読みましたが、どれも正しい答えをくれていないので、いくつか質問があります。

  1. エラーを修正するにはどうすればよいですか?
  2. プログラムで実行時にxamlモデルビューをロードする方法は?
  3. xamlを使用して実行時にxamlモデルビューをロードする方法は?
  4. 実行時に xaml の読み込みを呼び出す場所

サンプル データ ファイル、つまり SoundViewModelSampleData.xaml は次のようになります。

<vm:SoundViewModel
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:vm="clr-namespace:Soundboard.ViewModels"
    xmlns:mo="clr-namespace:Soundboard.Models">

    <vm:SoundViewModel.Animals>
        <vm:SoundGroupViewModel Title="Animals Sample">
            <vm:SoundGroupViewModel.Items>
                <mo:SoundDataModel Title="Animals 1" FilePath="Animals.wav" />
            </vm:SoundGroupViewModel.Items>
        </vm:SoundGroupViewModel>
    </vm:SoundViewModel.Animals>
    <vm:SoundViewModel.Cartoons>
        <vm:SoundGroupViewModel Title="Cartoons Sample">
            <vm:SoundGroupViewModel.Items>
                <mo:SoundDataModel Title="Cartoons 1" FilePath="Cartoons.wav" />
                <mo:SoundDataModel Title="Cartoons 2" FilePath="Cartoons.wav" />
            </vm:SoundGroupViewModel.Items>
        </vm:SoundGroupViewModel>
    </vm:SoundViewModel.Cartoons>
</vm:SoundViewModel>

私が見つけたプログラムでこれをロードする最も簡単なコードは次のとおりです。

string path = @".\SampleData\SoundViewModelSampleData.xaml";
using (System.IO.StreamReader reader = new System.IO.StreamReader(path))
{
    SoundViewModel vm = XamlReader.Load(reader.ReadToEnd()) as SoundViewModel;
}

今のところ間違った場所から呼び出している可能性がありますが、次のエラーが発生しています。

System.Windows.ni.dll で、タイプ 'System.Windows.Markup.XamlParseException' の初回例外が発生しました

{System.Windows.Markup.XamlParseException: 不明なパーサー エラー: スキャナー 2147500037。 [行: 5 位置: 14] MS.Internal.XcpImports.CreateFromXaml(String xamlString, Boolean createNamescope, Boolean requireDefaultNamespace, Boolean allowEventHandlers, Boolean expandTemplatesDuringParse, Boolean trimDeclaredEncoding ) System.Windows.Markup.XamlReader.Load(String xaml) で Soundboard.ViewModels.SoundViewModel.LoadData()} で

不明なパーサー エラー: スキャナー 2147500037。 [行: 5 位置: 14]

このエラーを解決できると仮定すると、これで質問 1 と 2 が処理されます (エラーを修正し、プログラムでデータをロードする)。

この問題の原因を特定できますか?

上で述べたように、私はおそらくこれを間違った場所、つまりアプリの読み込み時に作成された ViewModel 内から読み込んでいます。

namespace Soundboard.ViewModels
{
    public class SoundViewModel
    {
        public SoundGroupViewModel Animals { get; set; }
        public SoundGroupViewModel Cartoons { get; set; }

        public bool IsDataLoaded { get; set; }

        public void LoadData()
        {
            string path = @".\SampleData\SoundViewModelSampleData.xaml";
            using (System.IO.StreamReader reader = new System.IO.StreamReader(path))
            {
                SoundViewModel vm = System.Windows.Markup.XamlReader.Load(reader.ReadToEnd()) as SoundViewModel;
        }
        IsDataLoaded = true;
    }
}

}

そして、私の app.xaml.cs には次のものがあります。

public static SoundViewModel SoundViewModel
{
    get
    {
        if (_soundViewModel == null)
        {
            _soundViewModel = new SoundViewModel();
            _soundViewModel.LoadData();
        }

        return _soundViewModel;
    }
}

ランタイムに xaml だけを使用して同じことを達成し、デザインタイムに d:datacontext を使用するにはどうすればよいでしょうか。

私はいくつかの記事を読みましたが、それらはすべてwpfに関するものですが、ほとんどはユーザーコントロールのロードなどに関連しています..ビューモデルではありません

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

1

また、これを試してみましたが、データ XAML ファイルをアセットに移動し、それをリソースとしてマークし (カスタム ツールも削除しました)、次のようにロードするのが最善でした。

    public void LoadData()
    {
        // Load data
        //LoadCodeData();
        LoadXamlData();

        IsDataLoaded = true;
    }

    private void LoadXamlData()
    {
        string path = "SoundBoard;component/assets/runtimecontent/SampleData.xaml";
        Uri uri = new Uri(path, UriKind.Relative);
        using (System.IO.StreamReader reader = new System.IO.StreamReader((System.Windows.Application.GetResourceStream(uri)).Stream))
        {
            SoundModel model = System.Windows.Markup.XamlReader.Load(reader.ReadToEnd()) as SoundModel;
            this.Animals = model.Animals;
            this.Cartoons = model.Cartoons;
            this.Taunts = model.Taunts;
            this.Warnings = model.Warnings;
            this.CustomSounds = model.CustomSounds;
        }
    }

私もバーティが提案したことをしました。

于 2013-09-01T07:44:41.733 に答える