user3007447
user3007447

Reputation: 400

Trouble binding to a textblock - Windows Phone - MVVM

I have spent a couple hours trying to figure out this ONE problem. Here's what is happening:

I am trying to bind a Title to my XAML file from my ViewModel. All of the code executes (I checked using breakpoints/watch), but the binding doesn't actually work. I am very new to development and especially MVVM, so I am having a hard time figuring this out. Relevant code:

App.Xaml.Cs

        private static MainPageViewModel _mainPageViewModel = null;

    public static MainPageViewModel MainPageViewModel
    {
        get
        {
            if (_mainPageViewModel == null)
            {
                _mainPageViewModel = new MainPageViewModel();
            }
            return _mainPageViewModel;
        }
    }

MainPageModel

        public class MainPageModel : BaseModel
{
    private string _pageTitle;
    public string PageTitle
    {
        get { return _pageTitle; }
        set
        {
            if (_pageTitle != value)
            {
                NotifyPropertyChanging();
                _pageTitle = value;
                NotifyPropertyChanged();
            }
        }
    }

MainPageViewModel

        private void LoadAll()
    {
        var page = new MainPageModel();
        page.PageTitle = "title";

MainPageViewModel

        public MainPageViewModel()
    {

        LoadAll();
    }

MainPage.Xaml.Cs

        public MainPage()
    {
        InitializeComponent();
        DataContext = App.MainPageViewModel;
    }

MainPage.Xaml

<Grid x:Name="LayoutRoot">
    <phone:Panorama Title="{Binding PageTitle}">

Do I need a using statement in the Xaml too? I thought I just needed to set the data context in the MainPage.Xaml.Cs file.

I'm pretty sure I've posted all of the relevant code for this. Thanks everyone!!

Upvotes: 1

Views: 137

Answers (1)

McGarnagle
McGarnagle

Reputation: 102743

The problem is here, in the view model class:

private void LoadAll()
{
    var page = new MainPageModel();
    page.PageTitle = "title";

All you've done here is create a local object "page" -- this will not be accessible anywhere outside the local scope. I suppose what you meant to do is make "page" a member of "MainPageViewModel":

public class MainPageViewModel
{
    public MainPageModel Model { get; private set; }

    private void LoadAll()
    {
        _page = new MainPageModel();
        _page.PageTitle = "title";
    }
}

This way, you'll be able to bind to the "PageTitle" property -- but remember, it's a nested property, so you'll need:

<phone:Panorama Title="{Binding Model.PageTitle}">

Upvotes: 1

Related Questions