BindingContext在ViewModel中不访问获取方法

时间:2019-08-20 08:29:04

标签: c# xamarin xamarin.forms

我有一个viewModel,它链接到具有BindingContext的视图。

BindingContext = viewModelTest;

在我的ViewModel中,我做了一个自定义的吸气剂,目的是获取测试项目列表。

public class viewModelTest: INotifyPropertyChanged
{
    public List<string> partners
    {
        get
        {
            List<string> _partners = new List<string>() { "test1", "test2", "test3", "test3" };
            return _partners;
        }
    }
    public List<string> partnersTwo
    {
        get
        {
            List<string> _partners2 = new List<string>() { "test4", "test5", "test6", "test7" };
            return _partners;
        }
    }
}

以下是xaml:

<CarouselView>
    <CarouselView.ItemsLayout>
        <GridItemsLayout/>
            </CarouselView.ItemsLayout>
                <CarouselView.ItemTemplate>
                    <DataTemplate>
                        <Frame>
                            <Label Text="{Binding partners}"/>
                            <Label Text="{Binding partnersTwo}"/>
                        </Frame>
                    </DataTemplate>
    </CarouselView.ItemTemplate>
</CarouselView>

根据上面的代码,我无法访问我的吸气剂{Binding partners}

仅当我将BindingContext更改为以下内容时,才有可能:

BindingContext = viewModelTest.partners; 

这自然是不希望的,因为我希望能够将多个参数传递给我的视图,即partnersTwo。

因此,如何通过ViewModelTest在xaml文件中进行单独的绑定?

3 个答案:

答案 0 :(得分:2)

尝试一下:

<CarouselView ItemSource="{Binding partners}">
    <CarouselView.ItemsLayout>
        <GridItemsLayout/>
            </CarouselView.ItemsLayout>
                <CarouselView.ItemTemplate>
                    <DataTemplate>
                        <Frame>
                            <Label Text="{Binding}"/>
                        </Frame>
                    </DataTemplate>
    </CarouselView.ItemTemplate>
</CarouselView>

答案 1 :(得分:1)

您可以定义一个model并将控件的所有值(例如标签的文本或按钮的背景色)绑定到它的属性。

xaml

<CarouselView ItemSource="{Binding MyItems}">
   <CarouselView.ItemsLayout>
        <GridItemsLayout/>
            </CarouselView.ItemsLayout>
                <CarouselView.ItemTemplate>
                    <DataTemplate>
                        <Frame>
                            <Label Text="{Binding Title}"/>
                            <Label Text="{Binding Subtitle}"/>
                        </Frame>
                    </DataTemplate>
    </CarouselView.ItemTemplate>
</CarouselView>

后面的代码

public class ViewModelTest : INotifyPropertyChanged
{

   public event PropertyChangedEventHandler PropertyChanged;

   public ObservableCollection<Model> MyItems { get; set; }

   public ViewModelTest()
   {
      MyItems = new ObservableCollection<Model>() {

         new Model(){Title="Test1" ,Subtitle="Test6" },
         new Model(){Title="Test2" ,Subtitle="Test7" },
         new Model(){Title="Test3" ,Subtitle="Test8" },
         new Model(){Title="Test4" ,Subtitle="Test9" },
         new Model(){Title="Test5" ,Subtitle="Test10" },
     };
    }
}

public class Model
{
   public string Title { get; set; }
   public string Subtitle { get; set; }
}

答案 2 :(得分:0)

尝试一下:

Label="{Binding Source={x:Reference Name=myPage}, Path=BindingContext.DataContext.partners}"

其中:myPage是页面的名称(是的,您需要命名页面)

此处仅提供旁注:“文本”属性的类型为“字符串”。您正在返回字符串列表。考虑将字符串列表转换为一个字符串并将其返回到属性...