Mahender
Mahender

Reputation: 5664

Button text template data binding is not working

I am developing my first Windows 8 app, in one page i am trying to update button text with latest timestop when page loads. I defined my xaml and codebehind like below:

I am using databinding to update the button text but it is not working as expected:

MainPage.xaml

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
    <Button HorizontalAlignment="Left" Margin="333,284,0,0" VerticalAlignment="Top" Height="69" Width="162">
        <Button.Resources>
            <DataTemplate x:Key="DataTemplate1">
                <Grid>
                    <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding ButtonText}"  VerticalAlignment="Top" Foreground="#FFFF6800" Height="34" Margin="-30,0,-22,-14" Width="115"/>
                </Grid>
            </DataTemplate>
        </Button.Resources>
        <Button.ContentTemplate>
            <StaticResource ResourceKey="DataTemplate1"/>
        </Button.ContentTemplate>
    </Button>

</Grid>

MainPage.xaml.cs

public StatsClass Stats { get; private set; }

    public MainPage()
    {
        this.InitializeComponent();
        this.DataContext = Stats;
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        UpdateButton();
    }

    private void UpdateButton()
    {
        if (Stats == null)
            Stats = new StatsClass();

        Stats.ButtonText = DateTime.Now.ToString();
    }

StatsClass.cs

public class StatsClass : INotifyPropertyChanged
{
    private string _buttonText;
    public string ButtonText
    {
        get
        {
            return _buttonText;
        }

        set
        {
            _buttonText = value;
            OnPropertyChanged("ButtonText");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

Upvotes: 0

Views: 292

Answers (2)

Thorakas
Thorakas

Reputation: 135

I had a similar issue yesterday using binding in a DataTemplate. I guess that you also had a binding error in the debug output. I solved it using a relative source like that:

<TextBlock Text={Binding DataContext.ButtonText, 
           RelativeSource={RelativeSource FindAncestor, AncestorType=*YourControl*}}"/>

The Template has no direct access to the datacontext. By using the relative source you can bind to its properties.

Upvotes: 0

markmnl
markmnl

Reputation: 11426

You have set Content of your Button twice, once with Content="Button" and again with.Button.ContentTemplate. You could just have:

<Button HorizontalAlignment="Left" Margin="333,284,0,0" VerticalAlignment="Top" Height="69" Width="162">
    <Grid>
         <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding ButtonText}"  VerticalAlignment="Top" Foreground="#FFFF6800" Height="34" Margin="-30,0,-22,-14" Width="115"/>
    </Grid>
</Button>

Upvotes: 1

Related Questions