【问题标题】:BindingContext doesn't access getters in ViewModelBindingContext 不访问 ViewModel 中的 getter
【发布时间】:2019-12-25 10:20:56
【问题描述】:

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

BindingContext = viewModelTest;

在我的 ViewModel 中,我制作了一个自定义 getter,目的是获取测试项目列表。

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>

从上面的代码中,我无法访问我的 getter {Binding partners}

只有将 BindingContext 更改为以下内容才有可能:

BindingContext = viewModelTest.partners; 

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

因此,我怎样才能在我的 xaml 文件中从我的 ViewModelTest 进行单独的绑定?

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 它可以工作,但是如果我的 viewModel 中有另一个属性我想在另一个标签中访问呢?
    • 在这种情况下,创建一个具有两个公共字符串属性的类模式,例如 Label1 和 Label2。然后将它们绑定为 &lt;Label Text="{Binding Label1}"/&gt;&lt;Label Text="{Binding Label2}"/&gt;
    • @Avacay Label 是一个可以容纳单个内容的内容持有者。作为您的数据模型,如果您想单独显示所有项目,则需要标签列表
    • 当我有 DataTemplate 时应该没有必要?
    【解决方案2】:

    您可以定义一个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; }
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-08-03
        • 2021-09-05
        • 2020-06-29
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多