Xamarin表单自定义控件仅在更改ItemSelected时通知模型

问题描述 投票:0回答:1

嗨伙计们,我在我的Xamarin Forms项目中遇到了一些问题,在我的应用程序中,ListView在列中显示了许多行数据(500 ++),Xamarin Forms ListView渲染速度很慢(并且在滚动中使用ram),然后我创建一个自定义控件来使用本机ListView,它非常有用,现在渲染速度不是问题(滚动中的ram consumo也不是问题)。

但是这种方法的使用存在问题,现在当我编辑嵌入在listview的一行中的文本框时,模型上的属性不会被通知,而只会在我更改ItemSelected时被通知。

//我的自定义控件

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

//我的自定义控件渲染器

[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;
            }
        }
    }
}

//我的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}"/>

//我的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); }
        }

//构造函数;

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"},
            };
xamarin.forms uwp custom-controls uwp-xaml xamarin.uwp
1个回答
1
投票

我肯定会对原始设置感兴趣,因为我不认为Xamarin.Forms DataTemplate会导致任何性能问题,特别是在UWP上,所以绝对可以随意分享原始代码。

但是在UWP的这种情况下,TextBox中的属性更改通知仅在控件失去焦点后才会发生。如果要在每次击键后进行通知,则需要按如下方式编辑Binding

 Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
© www.soinside.com 2019 - 2024. All rights reserved.