ListView визуализирует UserControl перед привязкой - PullRequest
0 голосов
/ 07 ноября 2018

В двух словах, моя проблема:

  • Я отображаю коллекцию неизменяемых элементов, используя ListViewDataTemplate) в приложении Windows Universal / UWP.
  • Поскольку элементы в коллекции являются неизменяемыми, я бы хотел избежать изменения кода уведомления и использовать действующее {x:Bind Mode=OneTime} значение по умолчанию.
  • Однако, MyUserControl отображается до того, как его UserControlViewModel будет привязан. При отладке я вижу свойство get до set.

Как я могу убедиться, что UserControlViewModel установлен до того, как он отобразит OneTime?


Ниже приведен полный пример:

MainPage.xaml

<Page x:Class="MyApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:MyApp" xmlns:sys="using:System">
    <ListView ItemsSource="{x:Bind PageViewModel}">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="sys:String">
                <local:MyUserControl UserControlViewModel="{x:Bind}" />
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Page>

MainPage.xaml.cs

using Windows.UI.Xaml.Controls;
namespace MyApp {
    public sealed partial class MainPage : Page {
        public string[] PageViewModel { get; set; } = new string[] { "Item1", "Item2" };
        public MainPage() { InitializeComponent(); }
    }
}

MyUserControl.xaml

<UserControl x:Class="MyApp.MyUserControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock Text="{x:Bind ViewModel}" />
</UserControl>

MyUserControl.xaml.cs

using Windows.UI.Xaml.Controls;
namespace MyApp {
    public sealed partial class MyUserControl : UserControl {
        public string UserControlViewModel { get; set; } = "Default Value";
        public MyUserControl() { InitializeComponent(); }
    }
}

Этот код отображает страницу с двумя строками, содержащими текст «Значение по умолчанию»; Вместо этого я намеревался отобразить значения «Item1» и «Item2».


Если мы сделаем PageViewModel пустым ObservableCollection<string> и заполним его позже, проблема все еще будет присутствовать. Интересно, что замена ListView на ListBox или полное удаление ListView приведет к set до get и будет отображаться как предполагалось:

MainPage.xaml

<Page x:Class="MyApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:MyApp">
    <local:MyUserControl UserControlViewModel="{x:Bind PageViewModel[0]}" />
</Page>

1 Ответ

0 голосов
/ 08 ноября 2018

С некоторой помощью от FEC-4RP на форуме MSDN , я начинаю понимать, что происходит. Назначая каждому экземпляру MyUserControl уникальный идентификатор и отображая 100 из них в ListView, я вижу, что элементы управления перерабатываются платформой. Поэтому они, очевидно, также должны поддерживать позднюю привязку.

То есть, похоже, что ListView визуализирует элементы управления перед их привязкой, а OneTime привязка не разрешена на панели виртуализации пользовательского интерфейса. Однако я не уверен, так как я еще не нашел это в документации.

Я подозреваю, что значение по умолчанию VirtualizingStackPanel.VirtualizationMode изменилось на Recycling в UWP , с Standard в .NET .

Добавление DependencyProperty И установка режима привязки по умолчанию на MyUserControl (или все привязки, зависящие от модели представления элемента управления, как правило, все они) к чему-то другому, чем OneTime, представляется необходимым.

Не стесняйтесь объяснять здесь более подробно, и я приму ваш ответ, иначе я дополню это здесь полной информацией, когда я закончу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...