Benutzer mit den meisten Antworten
Binding von Elementen innerhalb von einem DataTemplate

Frage
-
Ich habe ein Frage,
und zwar kriege ich es einfach nicht hin wie ich folgende Eigenschaften "binden" kann...
<Grid x:Name="LayoutRoot" Tag="{Binding}"> <Hub x:Name="hubStart" SectionsInViewChanged="hubStart_SelectionsInViewChanged"> <!--Startseite--> <HubSection x:Uid="Section1" Header="start"> <DataTemplate> <Grid> <ProgressBar x:Name="pgBar"/> </Grid> </DataTemplate> </HubSection> <!--Über die App--> <HubSection x:Uid="Section4" Header="über diese App..."> <DataTemplate> <StackPanel> <TextBlock x:Name="txtTestBlock"/> </StackPanel> </DataTemplate> </HubSection> </Hub> </Grid>
Wie komme ich jetzt an das "value" von der ProgressBar und den "Text" von dem TextBlock?
Habe schon alles Mögliche probiert und schon viele Möglichkeiten von How-To's im Internet, aber keine hat funktioniert...
Btw. für WinRT falls das ne Rolle spielt!
Danke!
- Bearbeitet PHep Samstag, 7. März 2015 22:20
Antworten
-
Hallo,
zunächst muss deine Seite (wenn du diese als DataContext verwendest) INotifyPropertyChanged implementieren. Damit kannst du dann eine öffentliche Eigenschaft anlegen:public sealed partial class MainPage : Page, INotifyPropertyChanged { public MainPage() { this.DataContext = this; this.InitializeComponent(); } private double _Value; public double Value { get { return _Value; } set { if (_Value != value) { _Value = value; OnPropertyChanged(); } } } #region INotifyPropertyChanged Member private void OnPropertyChanged([CallerMemberName] string propertyName = "") { var evt = this.PropertyChanged; if (evt != null) evt(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; #endregion
Dann kannst du die Bindung wie oben gezeigt durchführen.
Über die implementierte Schnittstelle wird der GUI mit geteilt, das sich eine Eigenschaft geändert hat. Es ist wichtig, das dieses Event im Setter ausgelöst wird, auch das es wirklich eine öffentliche Eigenschaft ist.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert PHep Sonntag, 8. März 2015 23:09
Alle Antworten
-
Hallo,
wenn du der Page den DataContext zugewiesen hast und dieser eine Value-Eigenschaft hat, dann kannst du einfach direkt an diese binden:<HubSection x:Uid="Section1" Header="start"> <DataTemplate > <Grid> <ProgressBar x:Name="pgBar" Value="{Binding Value}"/> </Grid> </DataTemplate> </HubSection>
Gleiches gilt für die Text-Eigenschaft des TextBlocks. Teilweise musst du noch angeben, das der Modus TwoWay ist, damit die Bindung in beide Richtungen funktioniert. Das wäre beispielsweise bei einer TextBox wichtig:<TextBox x:Name="txtTestBlock" Text="{Binding Value, Mode=TwoWay}"/>
Ein direktes Abfragen von txtTextBlock und pgBar ist leider nicht möglich, wenn man ein Hub verwendet.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Danke, habe es aber irgendwie nicht hinbekommen. So sieht es zur Zeit aus (für die ProgressBar):
public sealed partial class Startseite : Page, IFileOpenPickerContinuable { private NavigationHelper navigationHelper; private ObservableDictionary defaultViewModel = new ObservableDictionary(); public int pgBarValue; public Startseite() { this.pgBarValue = new int(); this.DataContext = this; this.InitializeComponent(); } [...] //Mache gewisse Berechnungen void foo() { [...] pgBarValue = prozent }
Und mein XAML:
<Page
x:Class="Bible.Startseite"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Bible"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid> <Hub x:Name="hubStart" SectionsInViewChanged="hubStart_SelectionsInViewChanged"> <!--Startseite--> <HubSection x:Uid="Section1" Header="start"> <DataTemplate> <Grid> <ProgressBar x:Name="pgBar" Value="{Binding pgBarValue, Mode=OneWay}" Maximum="100" Height="5" IsIndeterminate="False"/> </Grid> </DataTemplate> </HubSection> <!--Über die App--> <HubSection x:Uid="Section4" Header="über diese App..."> <DataTemplate> <StackPanel> <TextBlock x:Name="txtTestBlock"/> </StackPanel> </DataTemplate> </HubSection> </Hub> </Grid>
</Page>
Was mache ich falsch?
- Bearbeitet PHep Sonntag, 8. März 2015 22:06
-
Hallo,
zunächst muss deine Seite (wenn du diese als DataContext verwendest) INotifyPropertyChanged implementieren. Damit kannst du dann eine öffentliche Eigenschaft anlegen:public sealed partial class MainPage : Page, INotifyPropertyChanged { public MainPage() { this.DataContext = this; this.InitializeComponent(); } private double _Value; public double Value { get { return _Value; } set { if (_Value != value) { _Value = value; OnPropertyChanged(); } } } #region INotifyPropertyChanged Member private void OnPropertyChanged([CallerMemberName] string propertyName = "") { var evt = this.PropertyChanged; if (evt != null) evt(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; #endregion
Dann kannst du die Bindung wie oben gezeigt durchführen.
Über die implementierte Schnittstelle wird der GUI mit geteilt, das sich eine Eigenschaft geändert hat. Es ist wichtig, das dieses Event im Setter ausgelöst wird, auch das es wirklich eine öffentliche Eigenschaft ist.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert PHep Sonntag, 8. März 2015 23:09