none
Dynamisches Binden von Werten und Eigenschaften RRS feed

  • Frage

  • Hallo zusammen, 
    Ich habe eine Aufgabenstellung die ich sonst so eigentlich nicht umsetze aber dieses mal geht es halt nicht anders.

    Ich habe eine Datenbank-Tabelle die "unbenannte Werte" mit Beschreibungen speichern sol. das heißt ich habe 10 Werte die vorher noch nicht wissen was sie eigentlich speichern. das ist jetzt soweit kein Problem aber ich möchte natürlich jetzt einen Dialog anzeigen mit den Werten die dort gespeichert sind  mit der richtigen Bezeichnung. Also

    Jeder der 10 dynamischen Werte in der Datenbank hat 3 Spalten

    1.Spalte (Type:String) (Default:DBNull) (Länge:50) (Inhalt: <Was ist das für ein Wert> z.B Einwohnerzahl:)
    2.Spalte (Type:Double) (Default:DBNull) (Inhalt: der eigentliche Wert)
    3.Spalte (Type:String) (Default:DBNull) (Länge:25) (Inhalt: <die Einheit des Wertes> z.B Leer, m², m³:)
    Und das jeweils für 10 Werte.
    Im Dialog (Fenster) sind in einer Tabelle (Grid) angeordnet immer 3 Steuerelemente in einer Zeile

    1.Spalte (Label) (Text:Bindung 1.Spalte:Inhalt [Wenn Inhalt=DBNull dann Text:leer oder "nicht festgelegt")
    2.Spalte (Textbox) (Text:Bindung 2.Spalte:Inhalt [Wenn Inhalt=DBNull dann TextBox.Visible=False oder leer")
    3.Spalte (Label) (Text:Bindung 1.Spalte:Inhalt [Wenn Inhalt=DBNull dann Text:leer oder "nicht festgelegt") 

    Am liebsten wäre mir natürlich wenn die TextBox nicht sichtbar wäre wenn der Wert in der Datenbanktabelle nicht belegt ist. Die 3 Spaltennamen heißen immer "value_01_name, value_01_wert, value_01_einheit", "value_02_name, value_02_wert, value_02_einheit" 

    Die Bindung erfolgt immer über eine einzelne Data.Row die vorher schon von der Selection einer Listbox kommt.

    Kann mir da jemand helfen?

    Gruß Thomas

    Donnerstag, 15. März 2018 09:07

Antworten

  • Hi Thomas,
    hier mal eine kleine Demo:

    XAML:

    <Window x:Class="Window24"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            mc:Ignorable="d"
            Title="Window24" Height="300" Width="300">
      <Window.Resources>
        <local:Window24VM x:Key="vm"/>
        <local:Window24Conv1 x:Key="conv1"/>
        <local:Window24Conv2 x:Key="conv2"/>
      </Window.Resources>
        <Grid DataContext="{StaticResource vm}">
        <ListBox ItemsSource="{Binding View}">
          <ListBox.ItemTemplate>
            <DataTemplate>
              <Grid>
                <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="100"/>
                  <ColumnDefinition Width="100"/>
                  <ColumnDefinition Width="100"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Content="{Binding Name, Converter={StaticResource conv1}}"/>
                <TextBox Grid.Column="1" Text="{Binding Wert}" Visibility="{Binding Wert, Converter={StaticResource conv2}}"/>
                <Label Grid.Column="2" Content="{Binding Einheit, Converter={StaticResource conv1}}"/>
              </Grid>
            </DataTemplate>
          </ListBox.ItemTemplate>
        </ListBox>
        </Grid>
    </Window>

    Dazu die Klassen:

    Imports System.ComponentModel
    Imports System.Data
    Imports System.Globalization
    
    Public Class Window24VM
    
      Private dt As DataTable
      Private cvs As New CollectionViewSource
    
      Public ReadOnly Property View As ICollectionView
        Get
          If cvs.Source Is Nothing Then cvs.Source = GetData()
          Return cvs.View
        End Get
      End Property
    
      Private Function GetData() As DataTable
        Dim rnd As New Random
        dt = New DataTable
        With dt
          With .Columns
            .Add("Name", GetType(Object))
            .Add("Wert", GetType(Object))
            .Add("Einheit", GetType(Object))
          End With
          For i = 1 To 10
            .Rows.Add(IIf(rnd.NextDouble > 0.75, DBNull.Value, $"Name {i}"),
                      IIf(rnd.NextDouble > 0.75, DBNull.Value, $"Wert {i}"),
                      IIf(rnd.NextDouble > 0.75, DBNull.Value, $"Einheit {i}"))
          Next
        End With
        Return dt
      End Function
    
    End Class
    
    Public Class Window24Conv1
      Implements IValueConverter
    
      Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
        If value Is DBNull.Value Then Return "nicht festgelegt"
        Return value
      End Function
    
      Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
        If value.ToString = "nicht festgelegt" Then Return DBNull.Value
        Return value
      End Function
    End Class
    Public Class Window24Conv2
      Implements IValueConverter
    
      Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
        Return If(value Is DBNull.Value, Visibility.Hidden, Visibility.Visible)
      End Function
    
      Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
        Return value
      End Function
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort vorgeschlagen Peter Fleischer Samstag, 17. März 2018 14:49
    • Als Antwort markiert tommytom73 Sonntag, 18. März 2018 13:43
    Freitag, 16. März 2018 17:55

Alle Antworten

  • Hi Thomas,
    Dein Problem ist recht einfach mit zwei Konverter lösbar. Ein Konverter bereitet die Textanzeige auf, der andere die Sichtbarkeit. Bei DBNull wird "nicht festgelegt" angezeigt, sonst der Text. Bei DBNull wird die Sichtbarkeit auf Collapsed oder Hidden gesetzt, sonst auf Visible.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 15. März 2018 18:26
  • Hi Thomas,
    Dein Problem ist recht einfach mit zwei Konverter lösbar. Ein Konverter bereitet die Textanzeige auf, der andere die Sichtbarkeit. Bei DBNull wird "nicht festgelegt" angezeigt, sonst der Text. Bei DBNull wird die Sichtbarkeit auf Collapsed oder Hidden gesetzt, sonst auf Visible.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Hallo Peter,

    ich dachte mir das es so gehen könnte. Hast Du irgendwo mal ein Beispiel mit den Konvertern?

    LG Thomas

    Freitag, 16. März 2018 07:00
  • Hi Thomas,
    hier mal eine kleine Demo:

    XAML:

    <Window x:Class="Window24"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1"
            mc:Ignorable="d"
            Title="Window24" Height="300" Width="300">
      <Window.Resources>
        <local:Window24VM x:Key="vm"/>
        <local:Window24Conv1 x:Key="conv1"/>
        <local:Window24Conv2 x:Key="conv2"/>
      </Window.Resources>
        <Grid DataContext="{StaticResource vm}">
        <ListBox ItemsSource="{Binding View}">
          <ListBox.ItemTemplate>
            <DataTemplate>
              <Grid>
                <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="100"/>
                  <ColumnDefinition Width="100"/>
                  <ColumnDefinition Width="100"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Content="{Binding Name, Converter={StaticResource conv1}}"/>
                <TextBox Grid.Column="1" Text="{Binding Wert}" Visibility="{Binding Wert, Converter={StaticResource conv2}}"/>
                <Label Grid.Column="2" Content="{Binding Einheit, Converter={StaticResource conv1}}"/>
              </Grid>
            </DataTemplate>
          </ListBox.ItemTemplate>
        </ListBox>
        </Grid>
    </Window>

    Dazu die Klassen:

    Imports System.ComponentModel
    Imports System.Data
    Imports System.Globalization
    
    Public Class Window24VM
    
      Private dt As DataTable
      Private cvs As New CollectionViewSource
    
      Public ReadOnly Property View As ICollectionView
        Get
          If cvs.Source Is Nothing Then cvs.Source = GetData()
          Return cvs.View
        End Get
      End Property
    
      Private Function GetData() As DataTable
        Dim rnd As New Random
        dt = New DataTable
        With dt
          With .Columns
            .Add("Name", GetType(Object))
            .Add("Wert", GetType(Object))
            .Add("Einheit", GetType(Object))
          End With
          For i = 1 To 10
            .Rows.Add(IIf(rnd.NextDouble > 0.75, DBNull.Value, $"Name {i}"),
                      IIf(rnd.NextDouble > 0.75, DBNull.Value, $"Wert {i}"),
                      IIf(rnd.NextDouble > 0.75, DBNull.Value, $"Einheit {i}"))
          Next
        End With
        Return dt
      End Function
    
    End Class
    
    Public Class Window24Conv1
      Implements IValueConverter
    
      Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
        If value Is DBNull.Value Then Return "nicht festgelegt"
        Return value
      End Function
    
      Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
        If value.ToString = "nicht festgelegt" Then Return DBNull.Value
        Return value
      End Function
    End Class
    Public Class Window24Conv2
      Implements IValueConverter
    
      Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
        Return If(value Is DBNull.Value, Visibility.Hidden, Visibility.Visible)
      End Function
    
      Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
        Return value
      End Function
    End Class


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort vorgeschlagen Peter Fleischer Samstag, 17. März 2018 14:49
    • Als Antwort markiert tommytom73 Sonntag, 18. März 2018 13:43
    Freitag, 16. März 2018 17:55
  • Hallo Peter,

    ganz lieben Dank, werde es diese Woche mal ausprobieren :-)

    LG Thomas

    Sonntag, 18. März 2018 13:43