简体   繁体   中英

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!!

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}">

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM