Benutzer mit den meisten Antworten
DependencyProperty von usercontrol zu Usercontrol

Frage
-
Hallo Welt,
wie immer zuerst Danke an alle die mir antworten.
Ich habe zwei Usercontrol
Die werden dynamisch mit grid.children.add(... integriert.
sub
Dim subControl As New uc_setfinder
Dim subClasse As New class_funktionen
subControl.Uid = "ucsetfinder" ' UID kann abgefragt werden
' Prüfe ob es das control bereits gibt
' da es nur einmal vorkommen darf
If subClasse.fu_controlvorhanden(stp_setfinder, subControl.Uid) = False Then
subControl.Name = "ucsetfinder"
stp_setfinder.Children.Add(subControl)
End Ifend sub
Beide haben eine Dependency Porperty
Public Shared HeizlastProperty As DependencyProperty =
Public Property Heizlast As Double
DependencyProperty.Register("Heizlast", GetType(Double), GetType(pg_stammdaten))
Get
Return GetValue(HeizlastProperty)
End Get
Set(ByVal value As Double)
SetValue(HeizlastProperty, value)
End Set
End PropertyWie kann ich nun es so festlegen, dass das eine usercontrol an das andere usercontrol einen Wert weitergibt.
ich hbae probieret im Vorfeld eine Databinding zu machen. hier kommt jedoch kein Wert anWie gesagt die usercontrols werden erst zur Laufzweit geadded.
Gerne auch weitere Infos - wenn benötigt.
Grüße und Danke Bernhard
Bernhard Meyer Danke
Antworten
-
Hi Bernhard,
aus den Bruchstücken deines Codes ist leider nicht genau erkennbar, wo dein Problem liegen kann. Vermutlich erzeugst du für jedes UserControl eine neue Instanz der Datenklasse. Hier mal eine Demo, wie das bei mir problemlos funktioniert:XAML Page:
<Page x:Class="UWP10App19041.Page01" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:UWP10App19041.Page01NS" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Page.DataContext> <local:ViewModel/> </Page.DataContext> <ItemsControl ItemsSource="{Binding View}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Vertical"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl> </Page>
Dazu der ViewModel:
Namespace Page01NS Public Class ViewModel Public Sub New() AddUusercontrols() End Sub Private data As New pg_stammdaten Sub AddUusercontrols() ' UserControl1 erstellen und Heizlast binden Dim subControl1 As New Page01UC1 subControl1.DataContext = data View.Add(subControl1) ' UserControl2 erstellen und Heizlast binden Dim subControl2 As New Page01UC1 subControl2.DataContext = data View.Add(subControl2) End Sub Public Property View As New ObservableCollection(Of UserControl) End Class Public Class pg_stammdaten Implements INotifyPropertyChanged Private _heizlast As Double Public Property Heizlast As Double Get Return Me._heizlast End Get Set(value As Double) If Me._heizlast <> value Then Me._heizlast = value OnPropertyChanged() End If End Set End Property Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged Protected Sub OnPropertyChanged(<CallerMemberName> Optional propertyName As String = "") RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) End Sub End Class End Namespace
XAML des Usercontrols:
<UserControl x:Class="UWP10App19041.Page01UC1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:UWP10App19041" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <UserControl.Resources> <Style TargetType="TextBox"> <Setter Property="Margin" Value="5"/> </Style> </UserControl.Resources> <Grid> <TextBox Text="{Binding Heizlast, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> </Grid> </UserControl>
Und der Codebehind des UserControls:
Imports UWP10App19041.Page01NS Public NotInheritable Class Page01UC1 Inherits UserControl Public Shared HeizlastProperty As DependencyProperty = DependencyProperty.Register("Heizlast", GetType(Double), GetType(pg_stammdaten), Nothing) Public Property Heizlast As Double Get Return GetValue(HeizlastProperty) End Get Set(ByVal value As Double) SetValue(HeizlastProperty, value) End Set End Property End Class
Ergebnis:
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Montag, 18. Oktober 2021 04:17
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 21. Oktober 2021 07:31
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 29. Oktober 2021 13:57
Alle Antworten
-
Hallo Welt,
wie immer zuerst Danke an alle die mir antworten - hier nochmal erläutert
Ich habe zwei Usercontrol und ein PAGE
Im Page und in den Usercontrols habe ich jeweils
Public Shared HeizlastProperty As DependencyProperty =
Public Property Heizlast As Double
DependencyProperty.Register("Heizlast", GetType(Double), GetType(pg_stammdaten))
Get
Return GetValue(HeizlastProperty)
End Get
Set(ByVal value As Double)
SetValue(HeizlastProperty, value)
End Set
End PropertyDie werden dynamisch mit grid.children.add(... integriert.
sub
Dim subControl As New uc_setfinder
Dim subClasse As New class_funktionen
subControl.Uid = "ucsetfinder" ' UID kann abgefragt werden
' Prüfe ob es das control bereits gibt
' da es nur einmal vorkommen darf
If subClasse.fu_controlvorhanden(stp_setfinder, subControl.Uid) = False Then
subControl.Name = "ucsetfinder"
stp_setfinder.Children.Add(subControl)
End Ifend sub
Alle drei haben eine Dependency Porperty
Public Shared HeizlastProperty As DependencyProperty =
Public Property Heizlast As Double
DependencyProperty.Register("Heizlast", GetType(Double), GetType(pg_stammdaten))
Get
Return GetValue(HeizlastProperty)
End Get
Set(ByVal value As Double)
SetValue(HeizlastProperty, value)
End Set
End PropertyAuf Grund eines Events aus usercontrol1 kann ich die Property Page,Heizlast aktualisieren,
Da ich das zweite Usercontrol auch dnamisch lade möcht ich die Page.heizlast an das Usercontrol binden.
Das probier ich mit
subControl.SetBinding(uc_setfinder.HeizlastProperty, "Heizlast")
stp_setfinder.Children.Add(subControl)Doch leider wird die Bindung nicht durchgeführt.
Der Wert in Usercontro2 bleibt 0
Zielist es,
wenn ich usercontrol1 einen Wert ändere, dass diese dann an das usercontrol2 übergeben wird.
derzeit:
usercontrol1 über Handler wird die Variable Heizlast in Page aktualisiert.
Wie kann ich es jetzt machen, dass dier Wert auch automatisch von Usercontrol2 empfengen wird.
Das müsste doch über ein dynamischen BINDING gehen ?
Danke an alle
Bernhard Meyer Danke
-
Hi Bernhard,
aus den Bruchstücken deines Codes ist leider nicht genau erkennbar, wo dein Problem liegen kann. Vermutlich erzeugst du für jedes UserControl eine neue Instanz der Datenklasse. Hier mal eine Demo, wie das bei mir problemlos funktioniert:XAML Page:
<Page x:Class="UWP10App19041.Page01" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:UWP10App19041.Page01NS" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Page.DataContext> <local:ViewModel/> </Page.DataContext> <ItemsControl ItemsSource="{Binding View}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <StackPanel Orientation="Vertical"/> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> </ItemsControl> </Page>
Dazu der ViewModel:
Namespace Page01NS Public Class ViewModel Public Sub New() AddUusercontrols() End Sub Private data As New pg_stammdaten Sub AddUusercontrols() ' UserControl1 erstellen und Heizlast binden Dim subControl1 As New Page01UC1 subControl1.DataContext = data View.Add(subControl1) ' UserControl2 erstellen und Heizlast binden Dim subControl2 As New Page01UC1 subControl2.DataContext = data View.Add(subControl2) End Sub Public Property View As New ObservableCollection(Of UserControl) End Class Public Class pg_stammdaten Implements INotifyPropertyChanged Private _heizlast As Double Public Property Heizlast As Double Get Return Me._heizlast End Get Set(value As Double) If Me._heizlast <> value Then Me._heizlast = value OnPropertyChanged() End If End Set End Property Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged Protected Sub OnPropertyChanged(<CallerMemberName> Optional propertyName As String = "") RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName)) End Sub End Class End Namespace
XAML des Usercontrols:
<UserControl x:Class="UWP10App19041.Page01UC1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:UWP10App19041" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <UserControl.Resources> <Style TargetType="TextBox"> <Setter Property="Margin" Value="5"/> </Style> </UserControl.Resources> <Grid> <TextBox Text="{Binding Heizlast, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> </Grid> </UserControl>
Und der Codebehind des UserControls:
Imports UWP10App19041.Page01NS Public NotInheritable Class Page01UC1 Inherits UserControl Public Shared HeizlastProperty As DependencyProperty = DependencyProperty.Register("Heizlast", GetType(Double), GetType(pg_stammdaten), Nothing) Public Property Heizlast As Double Get Return GetValue(HeizlastProperty) End Get Set(ByVal value As Double) SetValue(HeizlastProperty, value) End Set End Property End Class
Ergebnis:
--
Best Regards / Viele Grüße
Peter Fleischer (former MVP for Developer Technologies)
Homepage, Tipps, Tricks
- Bearbeitet Peter Fleischer Montag, 18. Oktober 2021 04:17
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Moderator Donnerstag, 21. Oktober 2021 07:31
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Moderator Freitag, 29. Oktober 2021 13:57