Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin表单可绑定选择器-如何在ViewModel中获取选定项_Xamarin_Xamarin.forms_Prism - Fatal编程技术网

Xamarin表单可绑定选择器-如何在ViewModel中获取选定项

Xamarin表单可绑定选择器-如何在ViewModel中获取选定项,xamarin,xamarin.forms,prism,Xamarin,Xamarin.forms,Prism,我使用的是Xamarin表单:2.3.4.247 棱镜库:6.3.0 以下是最新Xamarin表单中具有可绑定选择器ass的代码: 查看 在我的视图中注册(prism)行为,如下所示 xmlns:b=“clr命名空间:Prism.Behaviors;assembly=Prism.Forms” 选择器还显示CountryCodes的数据,这是PickerItem类型的列表 问题在于选择器绑定正确,但是在选择/更改选择时,不会发生任何情况: 我是不是错过了什么,在棱镜里 您不应该需要事件来命令行为。

我使用的是Xamarin表单:2.3.4.247 棱镜库:6.3.0

以下是最新Xamarin表单中具有可绑定选择器ass的代码: 查看

在我的视图中注册(prism)行为,如下所示

xmlns:b=“clr命名空间:Prism.Behaviors;assembly=Prism.Forms”

选择器还显示CountryCodes的数据,这是PickerItem类型的列表

问题在于选择器绑定正确,但是在选择/更改选择时,不会发生任何情况:


我是不是错过了什么,在棱镜里

您不应该需要事件来命令行为。您可以在如何使用选择器上看到这一点。这个例子没有使用Prism,但它的工作原理是完全相同的

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:local="clr-namespace:PickerDemo" 
             x:Class="PickerDemo.PickerDemoPage">
    <ContentPage.BindingContext>
        <local:PickerDemoPageViewModel />
    </ContentPage.BindingContext>
    <StackLayout Padding="10,20">
        <!-- Picker with explicitly set values in XAML -->
        <Picker SelectedItem="{Binding SelectedItem}">
            <Picker.Items>
                <x:String>Item 1</x:String>
                <x:String>Item 2</x:String>
            </Picker.Items>
        </Picker>
        <Label Text="{Binding SelectedItem,StringFormat='You Selected: {0}'}" />

        <!-- Picker with Dynamically set values -->
        <Picker ItemsSource="{Binding SomeCollection}" SelectedItem="{Binding AnotherItem}" />
        <Label Text="{Binding AnotherItem,StringFormat='You picked: {0}'}" />

        <!-- Date Picker using a custom display format -->
        <DatePicker Date="{Binding SomeDate}" Format="MMMM dd, yyyy" />
        <Label Text="{Binding SomeDate,StringFormat='{0:dd MMMM, yyyy}'}" />
    </StackLayout>

</ContentPage>

您是否尝试过双向绑定?@dickel-是的,您也尝试过,没有任何变化,有几次出现未处理的异常。然而,我不能调试它在哪一行发生这种情况。我能弄清楚的是与“EventArgsParameterPath”有关。如果我从代码中删除EventArgsParameterPath=“Item”参数,我可以dubug,并执行OnCountryPackerTapCommandExecuted(PickerItem项),但显然该项返回空值。因此,参数路径似乎存在一些我无法解决的问题,请大家帮助。不确定为什么我的LogCat显示NullReferenceException:如图所示------------------->Info 2411 MonoDroid System.NullReferenceException:对象引用未设置为对象的实例。在Prism.Behaviors.EventToCommandBehavior.OnEventRaised(System.Object sender,System.EventArgs EventArgs)[0x00054]中的:0。。。。C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\AppCompat\PickerRenderer.cs:103中的b_uu0(System.Object s,Android.Content.DialogClickEventArgs e)[0x00000实际上我需要在下一个视图中选择该项,Prism允许传递导航参数(以及所选项),上面的示例仅显示相同的视图绑定,这很简单,你能进一步建议吗?顺便问一下,福迪·韦弗需要什么?只是为了绑定在Prism中更改的属性?Fody是否提供相同的功能。我相信上面的更新应该回答您的问题。该示例使用Fody PropertyChanged来减少代码。您可以将其与BindableBase或任何基本ViewModel类一起使用。你可以在我的网站上了解更多。请注意,最新版本的Fody PropertyChanged实际上不支持使用
InjectPropertyChanged
属性,因为如果您添加
INotifyPropertyChanged
Brian Lagunas,它将自动拾取该属性,并在XF论坛中指出它()以及上述答案也符合标准。。。我还发现我的代码有一个不正确的类型属性,而不是类型属性,这也破坏了功能。所以我还是要感谢你们,并将此作为回答。
public DelegateCommand<PickerItem> ItemTappedCommand { get; }
ItemTappedCommand = new DelegateCommand<PickerItem>(OnCountryPickerTapCommandExecuted);
private void OnCountryPickerTapCommandExecuted(PickerItem item)
{
    SelectedCountryCode = item.Code;//some property I want it to assign
}
<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:local="clr-namespace:PickerDemo" 
             x:Class="PickerDemo.PickerDemoPage">
    <ContentPage.BindingContext>
        <local:PickerDemoPageViewModel />
    </ContentPage.BindingContext>
    <StackLayout Padding="10,20">
        <!-- Picker with explicitly set values in XAML -->
        <Picker SelectedItem="{Binding SelectedItem}">
            <Picker.Items>
                <x:String>Item 1</x:String>
                <x:String>Item 2</x:String>
            </Picker.Items>
        </Picker>
        <Label Text="{Binding SelectedItem,StringFormat='You Selected: {0}'}" />

        <!-- Picker with Dynamically set values -->
        <Picker ItemsSource="{Binding SomeCollection}" SelectedItem="{Binding AnotherItem}" />
        <Label Text="{Binding AnotherItem,StringFormat='You picked: {0}'}" />

        <!-- Date Picker using a custom display format -->
        <DatePicker Date="{Binding SomeDate}" Format="MMMM dd, yyyy" />
        <Label Text="{Binding SomeDate,StringFormat='{0:dd MMMM, yyyy}'}" />
    </StackLayout>

</ContentPage>
public class FooBar : BindableBase
{
    private INavigationService _navigationService { get; }

    public FooBar(INavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    private string _foo;
    public string Foo
    {
        get { return _foo; }
        set { SetProperty(ref _foo, value, OnFooChanged);}
    }

    private async void OnFooChanged() => 
        await _navigationService.NavigateAsync("SomePage", new NavigationParameters() { { "foo", Foo } });
}