Привязка данных и INotifyPropertyChanged не работает - PullRequest
3 голосов
/ 25 февраля 2011

В моем приложении WP7 я хочу обновить строку ApplicationTitle на всех страницах одновременно, когда что-то меняется. Я искал способы сделать это, и люди говорят об использовании привязки данных и интерфейса INotifyPropertyChanged. Однако, используя примеры, которые я нашел, я не могу заставить это работать. Я подозреваю, что привязка неверна, но не смогла обнаружить ошибку.

У меня есть класс с именем «RegistrationQueue», который имеет следующий код:

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

А это:

    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));
        }
    }

Насколько я помню, это просто копия / вставка из MSDN.

На одной из моих страниц XAML я написал это:

<TextBlock x:Name="ApplicationTitle" Text="{Binding AppTitle, Mode=OneWay}" Style="{StaticResource PhoneTextNormalStyle}" />

И я думал, что это будет работать, но это не так. Что я тут не так делаю?

Полный XAML для страницы:

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

Затем я написал "DataContext =" RegistreringsKø ";" в конструкторе для страницы XAML (loginscreen.cs)

Ответы [ 3 ]

2 голосов
/ 25 февраля 2011

Я не вижу ничего плохого в том, что вы уже опубликовали.Я полагаю, что ток DataContext для места размещения TextBlock не является экземпляром класса, обладающего этим свойством AppTitle.Следовательно, привязка не работает не потому, что она не может найти свойство AppTitle.

1 голос
/ 25 февраля 2011

Заявление очевидное, но раньше меня это укусило, вы уверены, что класс реализует интерфейс INotifyPropertyChanged и не просто объявил событие?

Я был укушен этим в прошлом при удалениибазовый класс модели представления ... у меня ушли годы на то, чтобы выяснить это: -)

Если это не удастся - что-нибудь связывает ошибки, появляющиеся в окне вывода при отладке?

0 голосов
/ 28 февраля 2011

Я не правильно использовал Datacontext.Я написал ApplicationTitle.Text = "RegistreringsKø" Который, конечно, должен был быть экземпляром объекта.

Так что в моем случае DataContext = Registration.getInstance(); решил это.

...