Связывание и упорядочение данных UWP: Как связать элемент управления с Border.child в ListView? - PullRequest
0 голосов
/ 24 мая 2018

Это для VB.NET и XAML для UWP.Я использую ListView, MyList с DataTemplate:

 <ListView x:Name="MyList">
        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Button Content="{Binding button1.Content}"></Button>
                    <TextBlock Text="{Binding col2}"></TextBlock>
                    <Border Child="{Binding button2}"></Border> 
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

И у меня есть: DataList As New cObservableListBase(Of Item) и

 Public Class Item
    'List Properties
    Public Property button1 As CustomButton
    Public Property col2 As String
    Public Property button2 As CustomButton
End Class

Public Class CustomButton
    Inherits Button
    Implements IComparable

    Public Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo
        CompareTo = 0
        If Content > CType(obj, CustomButton).Content Then
            CompareTo = 1
        ElseIf Content < CType(obj, CustomButton).Content Then
            CompareTo = -1
        End If
    End Function
End Class

И

MyList.ItemsSource = DataList

  For i = 65 To 85
      Dim b1 As New CustomButton With {.Content = Convert.ToChar(i)}
      Dim b2 As New CustomButton With {.Content = Convert.ToChar(i)}
      DataList.Add(New Item With {.button1 = b1, .col2 = Convert.ToChar(i), .button2 = b2})
   Next

ListView содержит3 столбца, и когда я упорядочиваю DataList для любого из столбцов, первые 2 столбца, которые были связаны с текстом, будут упорядочены правильно, но 3-й столбец, который был связан с самим элементом управления, покажет другой результат.Примечание: что сам DataList правильно упорядочивает 3 столбца, но проблема в представлении списка не отображает 3-й столбец должным образом.

Я что-то здесь не так делаю или это ошибка?и как правильно привязать к элементу управления?

Редактировать:

Я чувствовал, что должен добавить небольшую программу, чтобы облегчить любой желающий попробовать.

    <StackPanel Orientation="Vertical">
        <Button Name="ADD" Content="Add" Click="AddClick" />
        <Button Name="Order" Content="Order" Click="OrderClick"/>

        <ListView x:Name="MyList">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Button Content="{Binding button1.Content}"></Button>
                        <TextBlock Text="{Binding col2}"></TextBlock>
                        <Border Child="{Binding button2}"></Border>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
</StackPanel>

и в следующем коде:

Public NotInheritable Class MainPage
    Inherits Page
Public DataList As New ObservableCollection(Of Item)
Public Sub AddClick()
    MyList.ItemsSource = DataList
    For i = 65 To 85
        Dim b1 As New CustomButton With {.Content = Convert.ToChar(i)}
        Dim b2 As New CustomButton With {.Content = Convert.ToChar(i)}
        DataList.Add(New Item With {.button1 = b1, .col2 = Convert.ToChar(i), .button2 = b2})
    Next
End Sub

Public Sub OrderClick()
    Static NextOrder As Boolean = False

    Dim Sorted As IOrderedEnumerable(Of Item)
    If NextOrder Then
        Sorted = DataList.OrderBy(Function(p) p.col2)
    Else
        Sorted = DataList.OrderByDescending(Function(p) p.col2)
    End If
    NextOrder = Not NextOrder

    Dim SortedList = Sorted.ToList

    DataList.Clear()
    For i = 0 To SortedList.Count - 1
        DataList.Add(SortedList(i))
    Next
End Sub
End Class
Public Class Item
        'List Properties
        Public Property button1 As CustomButton
        Public Property col2 As String
        Public Property button2 As CustomButton  'or UIElement 
    End Class
Public Class CustomButton
    Inherits Button
    Implements IComparable

    Public Function CompareTo(obj As Object) As Integer Implements IComparable.CompareTo
        Return Content.ToString.CompareTo(CType(obj, CustomButton).Content.ToString)
    End Function
End Class

Сначала добавьте список, а затем попробуйте упорядочить его с помощью кнопки заказа, и проблема в 3-м столбце не упорядочена должным образом.Но при перезаписи программы я обнаружил, что DataList имеет правильный порядок даже в третьем столбце, но проблема в Listview не показывает это правильно !!

1 Ответ

0 голосов
/ 28 мая 2018

Я не смог воспроизвести вашу проблему на моей стороне, и я проверил ваш код.Я обнаружил, что привязка данных не является хорошей практикой, и я переписал ваш класс модели и xamlto, чтобы они выглядели краткими и ясными.Пожалуйста, обратитесь к следующему.

public class Item
{
    public string Content { get; set; }
    public string Color { get; set; }
    public UIElement BTNElement { get; set; }
}

XAML

<ListView Name="MyList">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Button Content="{Binding Content}"></Button>
                <TextBlock Text="{Binding Color}"></TextBlock>
                <Border Child="{Binding BTNElement}"></Border>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

Использование

MyList.ItemsSource = new List<Item> {
    new Item { Content = "ClickMe", Color = "Red", BTNElement = new Button { Content = "Nico" } },
    new Item { Content = "ClickMe", Color = "Green", BTNElement = new Button { Content = "Kite" } },
    new Item { Content = "ClickMe", Color = "Blue", BTNElement = new Button { Content = "Chuchu" } } };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...