0

わかりましたので、私は何時間も研ぎ澄まされてきましたが、ViewModel のデータがメイン ページの XAML にバインドされていない理由をまだ理解できません。私も新しいプロジェクトを開始し、同じ方法で問題なく実装したので、名前空間またはあまり慣れていない何かに関係している可能性があると考えています。

アプリケーションが起動したら、App.cs でグローバル ビューモデルを作成します。これを使用してデータを XAML ビューにバインドします。

public HomeViewModel ViewModel { get; private set; }

private void Application_Launching(object sender, LaunchingEventArgs e)
{
    ViewModel = new HomeViewModel();
    (App.Current as App).RootFrame.DataContext = (App.Current as App).ViewModel;
}

次に、HomeViewModel は次のようになります。

public class HomeViewModel : INotifyPropertyChanged
{       
    /***View Model***/

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }

    public HomeViewModel()
    {   
        PropertyChanged = new PropertyChangedEventHandler(delegate { });
    }

    public Profile CurrentProfile; /*EDIT: Missing {get;set;} Which is necessary for
                                    *any property, including ones below that I 
                                    *referenced in the XAML
                                    */

    public string NotificationImage; 

    public ButtonPanelPath UniversalButtonPath;

    public void setProfile(Profile p)
    {
        CurrentProfile = p;
        NotifyPropertyChanged("CurrentProfile");
    }
    .
    .
    ....rest of access methods and properties

プログラムを実行すると、HomeViewModel のデータが更新され、新しいフィールドが「設定」されるたびに NotifyPropertyChanged メソッドが呼び出されることを 100% 確信できます。

そして、このクラスは RootFrame にバインドされていますよね? では、メイン ページの xaml でこれらのフィールドにアクセスできるようにすべきではありませんか? これは、メイン グリッドのスタック パネルの xaml の一部の例です。

<Border BorderThickness="5" BorderBrush="Aqua" CornerRadius="20">
  <StackPanel Name="profileInfo"  DataContext="{Binding CurrentProfile}">
    <TextBlock Text="{Binding FirstName}" Name="profileName" FontSize="26" 
               FontWeight="Bold" HorizontalAlignment="Center" />
    <StackPanel Orientation="Horizontal">
      <StackPanel>
        <TextBlock Text="{Binding Level}" Name="userLevel" FontSize="32" 
                   Margin="10,0,0,0"/>
        <TextBlock Text="{Binding LevelName}" Name="levelName" FontSize="26" 
                   Margin="10,0,0,0"/>
        <TextBlock Text="{Binding PointsNeeded}" Name="pointsBar" 
                   Margin="10,0,0,0"/>
      </StackPanel>
      <Image x:Name="levelIcon" Source="{Binding PictureUrl}" 
             Margin="15,0,0,0"/>
    </StackPanel> 
  </StackPanel>
</Border>

ここで、Level、LevelName、PointsNeeded、および PictureUrl はすべて、Profile (または、参照している Profile の特定のインスタンスである CurrentProfile) のパブリック フィールドです。Profile.[field] を試してみましたが、それもうまくいきませんでした。バインディングを完了するために何が欠けているかを誰かが教えてくれれば、それは大歓迎です。

ちなみに、名前空間は次のとおりです
-MainPage は MyApp.src.pages
にあります

役立つ解決策/コメントをお寄せいただきありがとうございます。さらにデータ/情報が必要な場合は、お問い合わせください.

4

1 に答える 1

0

探しているバインディングは {Binding Property.SubProperty} です。

たとえば、あなたの場合は {Binding CurrentProfile.Level} です。

DataContext に「HomeViewModel」のインスタンスがあるため、そのすべてのプロパティにアクセスできます。プロパティとして複合型がある場合、その「サブ」プロパティにアクセスするには、型ではなく複合型のインスタンスであるプロパティにアクセスする必要があります。

それが役に立てば幸い。

于 2012-06-13T07:32:51.533 に答える