Reputation: 3243
In my WP7 app I want to update the ApplicationTitle string on all pages at the same time, when something is changed. I've searched for ways of doing it, and people talk about using databinding and the INotifyPropertyChanged interface. However, using the samples i've found, I cannot make it work. I suspect the binding to be wrong, but haven't been able to spot the error.
I have a class called "RegistrationQueue" which has the following code:
public void Gem()
{
var settings = IsolatedStorageSettings.ApplicationSettings;
if (settings.Contains("regqueue"))
{
settings["regqueue"] = _registreringsListe;
}
else
settings.Add("regqueue", _registreringsListe);
AppTitle = "LOGIMATIC A/S - " + _registreringsListe.Count + " registreringer i kø";
}
And this:
private string _AppTitle;
// Declare the PropertyChanged event.
public event PropertyChangedEventHandler PropertyChanged;
// Create the property that will be the source of the binding.
public string AppTitle
{
get { return _AppTitle; }
set
{
_AppTitle = value;
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("AppTitle");
}
}
// NotifyPropertyChanged will raise the PropertyChanged event,
// passing the source property that is being updated.
public void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(propertyName));
}
}
Which is basicly a copy/paste from MSDN as far as I can remember.
In one of my XAML pages I've written this:
<TextBlock x:Name="ApplicationTitle" Text="{Binding AppTitle, Mode=OneWay}" Style="{StaticResource PhoneTextNormalStyle}" />
And I thought it would work, but it does not. What am I doing wrong here?
Full XAML for the page:
<phone:PhoneApplicationPage
x:Class="FotoDokUdkast.loginScreen"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
mc:Ignorable="d" FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="PortraitOrLandscape" Orientation="Portrait"
shell:SystemTray.IsVisible="True" d:DesignHeight="696" d:DesignWidth="480">
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Black">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<!--<TextBlock x:Name="ApplicationTitle" Text="LOGIMATIC A/S" Style="{StaticResource PhoneTextNormalStyle}"/>-->
<TextBlock x:Name="ApplicationTitle" Text="{Binding Path=AppTitle, Mode=OneWay}" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="FotoDok 0.5b " Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" Background="Black">
<TextBlock Height="30" HorizontalAlignment="Left" Margin="6,6,0,0" Name="textBlock1" Text="Et Logimatic program" VerticalAlignment="Top" Width="444" />
<toolkit:ListPicker Name="pickerProject" Margin="9,42,15,0" Header="Vælg projekt" ListPickerMode="Normal" ItemCountThreshold="0" FullModeHeader="Vælg projekt" Height="97" VerticalAlignment="Top" />
<Button Content="Log ind" Height="72" HorizontalAlignment="Left" Margin="6,337,0,0" Name="btnLogin" VerticalAlignment="Top" Width="444" Click="btnLogin_Click" />
<toolkit:ListPicker Header="Vælg bruger" Margin="9,145,15,292" Name="pickerUser" ListPickerMode="Normal" ItemCountThreshold="0" FullModeHeader="Vælg bruger" />
</Grid>
</Grid>
<!--Sample code showing usage of ApplicationBar-->
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="Images/appbar.sync.rest.png" Text="Opdater projekter" Click="ApplicationBarIconButtonOpdater_Click"/>
<shell:ApplicationBarIconButton IconUri="Images/appbar.delete.rest.png" Text="Slet projekter" Click="ApplicationBarIconButtonSlet_Click"/>
<shell:ApplicationBarIconButton IconUri="Images/appbar.feature.email.rest.png" Text="Registreringer i kø" Click="ApplicationBarIconButtonRegistrering_Click"/>
<shell:ApplicationBarIconButton IconUri="Images/appbar.feature.settings.rest.png" Text="Tilpas opsætning" Click="ApplicationBarIconButtonSettings_Click"/>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
</phone:PhoneApplicationPage>
I've then written "DataContext = "RegistreringsKø"; " in the constructor for the XAML page (loginscreen.cs)
Upvotes: 3
Views: 2923
Reputation: 3243
I was not using the Datacontext correctly.
I had written ApplicationTitle.Text = "RegistreringsKø"
Which of course should've been an instance of the object instead.
So in my case, DataContext = Registration.getInstance();
solved it.
Upvotes: 0
Reputation: 26599
Stating the obvious, but it's bitten me before, are you sure the class implements the INotifyPropertyChanged interface and doesn't just have the event declared?
I've been bitten by that in the past when removing a view model base class .. took me ages to figure it out :-)
Failing that - anything binding errors showing up in the Output window when you're debugging?
Upvotes: 1
Reputation: 189437
I can't see anything wrong with what you have posted so far. My guess would be that the DataContext
current for where the TextBlock
is sited is not an instance of the class that has this AppTitle
property. Hence the binding doesn't work not because it can't find the AppTitle
property.
Upvotes: 2