locked
UWP, Datatemplate, Combobox and Binding. How to Use Combobox as part of DataTemplate for ListView ItemTemplate? RRS feed

  • Question

  • I have a following code:

    1) Visual Basic. MainPage.xaml.vb

    Imports System.Collections.Generic
    Imports System.Globalization
    Imports Windows.UI
    
    Public Class TabMatConv1
        Implements IValueConverter
    
        Public Function Convert(value As Object, targetType As Type, parameter As Object, language As String) As Object Implements IValueConverter.Convert
            Return value.ToString
        End Function
    
        Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, language As String) As Object Implements IValueConverter.ConvertBack
            Throw New NotImplementedException()
        End Function
    End Class
    Public Class InttoSrtConv
        ' конвертор для конвертирования целочисленных значений в строковые и обратно
        Implements IValueConverter
        Public Function Convert(value As Object, targetType As Type, parameter As Object, language As String) As Object Implements IValueConverter.Convert
            Return value.ToString
        End Function
    
        Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, language As String) As Object Implements IValueConverter.ConvertBack
            Try
                Dim current1 As NumberFormatInfo = NumberFormatInfo.CurrentInfo
                Dim StringValue As String = value.ToString
                StringValue = StringValue.Replace(".", current1.CurrencyDecimalSeparator)
                StringValue = StringValue.Replace(",", current1.CurrencyDecimalSeparator)
    
                Select Case targetType.Name
                    Case "Single"
                        Return System.Convert.ToSingle(StringValue, current1)
                    Case "Double"
                        Return System.Convert.ToDouble(StringValue, current1)
                    Case "UInt32"
                        Return System.Convert.ToUInt32(StringValue, current1)
                    Case "Int32"
                        Return System.Convert.ToInt32(StringValue, current1)
                    Case "Integer"
                        Return CType(StringValue, Integer)
    
                    Case "UInteger"
                        Return CType(StringValue, UInteger)
                End Select
            Catch ex As Exception
                Return 0
            End Try
        End Function
    End Class
    
    Public NotInheritable Class MainPage
        Inherits Page
        Public Class Matirial
            Public Property CodeMat As UShort
            Public Property NameMat As String
    
    
            Public Sub New(ByVal CodeMat1 As UShort,
                               ByVal NameMat1 As String)
                CodeMat = CodeMat1
                NameMat = NameMat1
            End Sub
        End Class
    
        Function GetMaterial() As IEnumerable(Of Matirial)
    
    
            Return New ObservableCollection(Of Matirial) From
                        {
                        New Matirial(1, "New Steel"),
                        New Matirial(2, "New Iron"),
                        New Matirial(3, "Old Steel&Iron"),
                        New Matirial(4, "Asbestos"),
                        New Matirial(5, "Сoncrete"),
                        New Matirial(6, "Plastic")
                         }
    
        End Function
        Public Class Pipe_Type
            Public Property Label As String
            Public Property Lx As UInt16
    
            Public Property Diam As UInt16
            Public Property Mat As UInt16
            Public Sub New(ByVal Label1 As String, Lx1 As UInt16, Diam1 As UInt16, mat1 As UInt16)
                Label = Label1
                Lx = Lx1
                Diam = Diam1
                Mat = mat1
            End Sub
        End Class
        Public TabMat As ObservableCollection(Of Matirial) = GetMaterial()
        Public Pipes As New ObservableCollection(Of Pipe_Type)()
        Dim curMatView = From Mat In TabMat Select Mat.CodeMat, Mat.NameMat
        Public CV As CollectionViewSource = New CollectionViewSource With {.Source = curMatView}
        Private MainGrid As Grid
        Dim lvp As ListView
    
        Dim cvs As CollectionViewSource
        Sub New()
            InitializeComponent()
            Pipes.Add(New Pipe_Type("Label1", 122, 100, 1))
            Pipes.Add(New Pipe_Type("Label2", 152, 150, 2))
            Pipes.Add(New Pipe_Type("Label3", 162, 200, 2))
            Pipes.Add(New Pipe_Type("Label4", 171, 50, 1))
            Pipes.Add(New Pipe_Type("Label5", 181, 60, 4))
    
            MainGrid = New Grid With {.BorderThickness = New Thickness(5),
                     .BorderBrush = New SolidColorBrush(Windows.UI.Colors.Blue)} ' ,
            ' .Visibility = Visibility.Visible, .CenterPoint = New Numerics.Vector3(0)}
    
            Dim GridCol As New ColumnDefinition With {.Width = New GridLength(1, GridUnitType.Auto)}
            MainGrid.ColumnDefinitions.Add(GridCol)
            MainGrid.ColumnDefinitions.Add(New ColumnDefinition With {.Width = New GridLength(1, GridUnitType.Star)})
            MainGrid.ColumnDefinitions.Add(New ColumnDefinition With {.Width = New GridLength(1, GridUnitType.Auto)})
            MainGrid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(1, GridUnitType.Auto)})
            MainGrid.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(3, GridUnitType.Star)})
            Me.Content = MainGrid
            Dim grd As Grid = New Grid
            grd.ColumnDefinitions.Add(New ColumnDefinition With {.Width = New GridLength(1, GridUnitType.Auto)})
            grd.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(3, GridUnitType.Auto)})
            grd.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(3, GridUnitType.Star)})
            grd.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(3, GridUnitType.Auto)})
            grd.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(3, GridUnitType.Auto)})
            grd.RowDefinitions.Add(New RowDefinition With {.Height = New GridLength(3, GridUnitType.Star)})
            MakeChildAndSetCR(grd, 2, 1)
    
            lvp = New ListView With {.Name = "LV2",
            .HorizontalAlignment = HorizontalAlignment.Left,
            .IsSynchronizedWithCurrentItem = False,
            .VerticalAlignment = VerticalAlignment.Stretch,
            .RequestedTheme = ElementTheme.Default,
            .SelectionMode = ListViewSelectionMode.Single,
            .ItemTemplate = CType(Me.Resources("dt2"), DataTemplate),
            .ReorderMode = ListViewReorderMode.Enabled
                    }
    
            Dim StPnllvP As StackPanel = New StackPanel With {.Orientation = Orientation.Horizontal, .Margin = New Thickness(2)}
            Dim borderLVP = New Border With {.BorderBrush = New SolidColorBrush(Colors.Green),
                   .BorderThickness = New Thickness(2),
                   .Background = New SolidColorBrush(Colors.White), .CornerRadius = New CornerRadius(20),
                   .Child = StPnllvP}
            StPnllvP.Children.Add(lvp)
            Dim GreatStPanel1 = New StackPanel With {.Orientation = Orientation.Horizontal, .Margin = New Thickness(2)}
            GreatStPanel1.Children.Add(borderLVP)
            grd.Children.Add(GreatStPanel1)
            Grid.SetColumn(GreatStPanel1, 0)
            Grid.SetRow(GreatStPanel1, 4)
    
            Dim bng2 As Binding = New Binding With {.Mode = BindingMode.TwoWay, .Source = Pipes}
            lvp.SetBinding(ListView.ItemsSourceProperty, bng2)
    
        End Sub
        Sub MakeChildAndSetCR(obj As Object, c As UInt16, r As UInt16)
            
            MainGrid.Children.Add(obj)
            Grid.SetColumn(obj, c)
            Grid.SetRow(obj, r)
        End Sub
    End Class

    2. XAML. MainPage.xaml.

    <Page x:Name="Page"
        x:Class="ComboTest.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:ComboTest"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" >
        <Page.Resources>
            <local:InttoSrtConv x:Name="Conv2"></local:InttoSrtConv>
            <local:TabMatConv1 x:Name="Conv3"></local:TabMatConv1>
            <CollectionViewSource x:Name="MatCollection" Source="{x:Bind TabMat,  Mode=OneWay}"/>
            <!--
           
    
            -->
    
            <DataTemplate x:Key ="dt2">
                <StackPanel Orientation="Horizontal" Margin="2"  BorderBrush="Black" BorderThickness="2">
    
                    <TextBox Name="Label" Text="{Binding Path=Label, Mode=TwoWay}" Margin="2" Width="90" TextAlignment="Center" InputScope="Number" MaxLength ="7"
                             AcceptsReturn ="False" />
                    <TextBox Name ="Lx" Text="{Binding Path=Lx, Mode=TwoWay, Converter={StaticResource Conv2 }}" Margin="2" Width="90" TextAlignment="Center" InputScope="Number" MaxLength ="7"
                             AcceptsReturn ="False"/>
                    <TextBox Name ="Diam" Text="{Binding Diam, Mode=TwoWay, Converter={StaticResource Conv2 }}" Margin="2" Width="90" TextAlignment="Center"
                             InputScope="Number" MaxLength ="5" AcceptsReturn ="False"/>
                    <ComboBox Name ="CB_PipeType"
                        SelectedItem ="{Binding Path=Mat,Mode=TwoWay}"
                              SelectedValuePath="CodeMat"
                              DisplayMemberPath="CodeMat"                          
                              Margin="2"
                              Width="90"
                              IsEditable ="True" 
                              IsDropDownOpen="False"
                              ItemsSource="{Binding Source={StaticResource MatCollection},Mode=OneWay}" >
                      
                        
                    </ComboBox>
                </StackPanel>
            </DataTemplate>
        </Page.Resources>
    
    </Page>

    When I make first binding for combobox, 

    SelectedItem ="{Binding Path=Mat,Mode=TwoWay}"
     Code works normally, each combobox element show correct  start value, but have a null value in ItemsSource.  

    Then I add Binding for Combobox in MainPage.xml,

    ItemsSource="{Binding Source={StaticResource MatCollection},Mode=OneWay}"

    any changing of value combobox element in runtime, change values in all combobox items. 

    I think,  Combobox have a two binding, and XAML use ItemsSource Combobox binding for generate ListView.

    If I create Combobox items manually, in XAML code, like this:

    <x:String>1</x:String>

    <x:String>2</x:String>

    It's work fine.

    Have anybody positive experience for use Combobox in Datatemplate for ListView ItemSource and it binding ItemsSource and SelectedItem properties?

    Saturday, October 17, 2020 1:52 PM

All replies

  • The following link will show were to post as this current forum is not the right forum.


    Please remember to mark the replies as answers if they help and unmarked them if they provide no help, this will help others who are looking for solutions to the same or similar problem. Contact via my Twitter (Karen Payne) or Facebook (Karen Payne) via my MSDN profile but will not answer coding question on either.

    NuGet BaseConnectionLibrary for database connections.

    StackOverFlow
    profile for Karen Payne on Stack Exchange

    Sunday, October 18, 2020 2:21 AM