none
DependencyProperty von usercontrol zu Usercontrol RRS feed

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

    end sub

    Beide haben eine Dependency Porperty

     Public Shared HeizlastProperty As DependencyProperty =
           DependencyProperty.Register("Heizlast", GetType(Double), GetType(pg_stammdaten))

     Public Property Heizlast As Double
            Get
                Return GetValue(HeizlastProperty)
            End Get
            Set(ByVal value As Double)
                SetValue(HeizlastProperty, value)
            End Set
        End Property

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

    Wie gesagt die usercontrols werden erst zur Laufzweit geadded.

    Gerne auch weitere Infos - wenn benötigt.

    Grüße und Danke Bernhard


    Bernhard Meyer Danke

    Sonntag, 17. Oktober 2021 18:19

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





    Montag, 18. Oktober 2021 04:14

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 =
           DependencyProperty.Register("Heizlast", GetType(Double), GetType(pg_stammdaten))

     Public Property Heizlast As Double
            Get
                Return GetValue(HeizlastProperty)
            End Get
            Set(ByVal value As Double)
                SetValue(HeizlastProperty, value)
            End Set
        End Property

    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 If

    end sub

    Alle drei haben eine Dependency Porperty

     Public Shared HeizlastProperty As DependencyProperty =
           DependencyProperty.Register("Heizlast", GetType(Double), GetType(pg_stammdaten))

     Public Property Heizlast As Double
            Get
                Return GetValue(HeizlastProperty)
            End Get
            Set(ByVal value As Double)
                SetValue(HeizlastProperty, value)
            End Set
        End Property

    Auf 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

    Sonntag, 17. Oktober 2021 21:22
  • 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





    Montag, 18. Oktober 2021 04:14