سؤال

أنا جديد نسبيًا في هندسة MVVMCross وMVVM.

أحاول أن أبقي برنامج CodeBehind الخاص بي نظيفًا قدر الإمكان لذلك كنت أستخدمه Interactivity:Interaction.Behaviors لتشغيل أمر عند النقر فوق عنصر:

<views:MvxStorePage.Resources>
        <core:Theme x:Key="Theme"/>
        <b:NameScopeBinding  x:Key="ModuleGridView" Source="{Binding ElementName=ModuleGridView}" />
</views:MvxStorePage.Resources>
...
<GridView x:Name="ModuleGridView" >
...
<Interactivity:Interaction.Behaviors>
     <Core:EventTriggerBehavior EventName="SelectionChanged">
          <Core:InvokeCommandAction Command="{Binding SelectModuleCommand}" CommandParameter="{Binding Source.SelectedItem, Source={StaticResource ModuleGridView}}" />
     </Core:EventTriggerBehavior>
</Interactivity:Interaction.Behaviors>
...
</GridView>

وفي ViewModel الخاص بي:

MvxCommand<object> _selectModuleCommand;
        public ICommand SelectModuleCommand
        {
            get
            {
                _selectModuleCommand = _selectModuleCommand ?? new MvxCommand<object>((obj) => SelectModule(obj));
                return _selectModuleCommand;
            }
        }

        private void SelectModule(object module)
        {
            var test = 1;
        }

المشكلة هي أن الكائن تم تمريره إلى SelectModule هو من النوع ItemClickedEventArgs وهو غير متوفر في مشروع PCL الأساسي حيث توجد ViewModels الخاصة بي.لذلك لا أستطيع الوصول إلى ItemClicked خاصية ذلك الكائن.

لقد حاولت استخدام هذا من ´InvocamandAction´ الخاص بي

 <Core:InvokeCommandAction Command="{Binding SelectModuleCommand}" CommandParameter="{Binding Source.SelectedItem.ClickedItem, Source={StaticResource ModuleGridView}}" />

ولكن ليس له أي تأثير، ما زلت أحصل عليه ItemClickedEventArgs كمعلمة لأمري

هل كانت مفيدة؟

المحلول

تم الحل باستخدام خاصية InputConverter الخاصة بـ InvocamandAction

<interactivity:Interaction.Behaviors>
                            <icore:EventTriggerBehavior EventName="ItemClick">
                                <icore:InvokeCommandAction Command="{Binding SelectModuleCommand}" InputConverter="{StaticResource ItemClickedConverter}" />
                            </icore:EventTriggerBehavior>
                        </interactivity:Interaction.Behaviors>

محول العنصر الذي تم النقر عليه:

public class ItemClickedConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            var args = value as ItemClickEventArgs;

            if (args != null)
                return args.ClickedItem;

            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter,
            string language)
        {
            throw new NotImplementedException();
        }
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top