Только пользовательский элемент управления Xamarin Forms Уведомить модель об изменении ItemSelected - PullRequest
0 голосов
/ 11 сентября 2018

Привет, ребята. У меня возникли некоторые проблемы в моем проекте Xamarin Forms, в моем приложении ListView показывает много строк данных в столбцах (500 ++), рендеринг Xamarin Forms ListView был очень медленным (и потреблял оперативную память при прокрутке)Затем я создаю пользовательский элемент управления для использования нативного ListView, это было очень полезно, и теперь скорость рендеринга не является проблемой (также не является проблемой оперативная память в свитке).

Но использование этогоВ методе возникла проблема: теперь, когда я редактирую текстовое поле, встроенное в строку списка, свойство модели не уведомляется, а уведомляется только при изменении ItemSelected.

// Мой пользовательский элемент управления

public class NativeListView : ListView
    {
        public NativeListView()
        {
        }
    }

// My Custom Control Renderer

[assembly: ExportRenderer(typeof(NativeListView), typeof(NativeListViewRenderer))]
namespace AppName.UWP.NativeCode.CustomControlsRenderers
{
  public  class NativeListViewRenderer : ListViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.ListView> e)
        {
            base.OnElementChanged(e);

            if (Control is ListView listView)
            {
                listView.ItemTemplate = App.Current.Resources["NativeListViewItemTemplate"] as DataTemplate;
            }
        }
    }
}

// My DataTemplate

<DataTemplate x:Key="NativeListViewItemTemplate">
                <Grid>

                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>

                    <TextBox Grid.Column="0"
                             Text="{Binding Value, Mode=TwoWay}"/>

                    <TextBlock Grid.Column="1"
                               Foreground="Red"
                               Text="{Binding Validate}"/>

                </Grid>
            </DataTemplate>

// Моя страница XAML

<customcontrols:NativeListView
                        Grid.Row="2"
                        VerticalOptions="FillAndExpand"
                        SelectionMode="Single"
                        ItemsSource="{Binding NativeListView_ItemsSource}"/>

// My PageViewModel

public class Model : BindableBase
        {
            private string _value;
            public string Value
            {
                get { return _value; }
                set { SetProperty(ref _value, value, () => RaisePropertyChanged(nameof(Validate))); }
            }

            public string Validate
            {
                get
                {
                    if (string.IsNullOrWhiteSpace(Value))
                    {
                        return "❌";
                    }
                    return "✔";
                }
            }
        }

        private ObservableCollection<Model> nativeListView_ItemsSource;
        public ObservableCollection<Model> NativeListView_ItemsSource
        {
            get { return nativeListView_ItemsSource; }
            set { SetProperty(ref nativeListView_ItemsSource, value); }
        }

// Ctor:

NativeListView_ItemsSource = new ObservableCollection<Model>
            {
                new Model(){Value="8"},new Model(){Value="1"},new Model(){Value=""},
                new Model(){Value="6"},new Model(){Value=""},new Model(){Value="4"},
                new Model(){Value="7"},new Model(){Value="5"},new Model(){Value="7"},
            };

1 Ответ

0 голосов
/ 11 сентября 2018

Меня определенно заинтересуют исходные настройки, потому что я не думаю, что Xamarin.Forms DataTemplate должна вызывать какие-либо проблемы с производительностью, особенно в UWP, поэтому определенно не стесняйтесь делиться оригинальным кодом.

Однако в этом случае в UWP уведомление об изменении свойства в TextBox происходит только после потери фокуса элемента управления. Если вы хотите, чтобы уведомление появлялось после каждого нажатия клавиши, вам нужно отредактировать Binding следующим образом:

 Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
...