سلوكيات MVVMCross وInvocamandAction
-
21-12-2019 - |
سؤال
أنا جديد نسبيًا في هندسة 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();
}
}
لا تنتمي إلى StackOverflow