Xamarin.forms Xamarin使用DataTemplateSelector形成绑定布局

Xamarin.forms Xamarin使用DataTemplateSelector形成绑定布局,xamarin.forms,Xamarin.forms,我的代码是有效的,但在我看来,它是一个笨拙的剪切粘贴解决方案。我正在寻找一种更有效的编码XAML的方法,这样网格就不需要定义两次,而是使用不同的背景色 该代码为ListView的行生成交替颜色背景。这是一个不同的问题 我的代码的一个简化示例: <ContentPage.Resources> <DataTemplate x:Key="evenTemplate"> <ViewCell> <Grid Backgr

我的代码是有效的,但在我看来,它是一个笨拙的剪切粘贴解决方案。我正在寻找一种更有效的编码XAML的方法,这样网格就不需要定义两次,而是使用不同的背景色

该代码为ListView的行生成交替颜色背景。这是一个不同的问题

我的代码的一个简化示例:

<ContentPage.Resources>
    <DataTemplate x:Key="evenTemplate">
        <ViewCell>
            <Grid BackgroundColor="White" >
            <Label Text="{Binding Data}" />
            </Grid>
        </ViewCell>
    </DataTemplate>
    <DataTemplate x:Key="unevenTemplate">
        <ViewCell>
            <Grid BackgroundColor="Black" >
            <Label Text="{Binding Data}" />
            </Grid>
        </ViewCell>
    </DataTemplate>
    <local:AlternateColorDataTemplateSelector x:Key="alternateColorDataTemplateSelector"
            EvenTemplate="{StaticResource evenTemplate}"
            UnevenTemplate="{StaticResource unevenTemplate}" />
</ContentPage.Resources>
<ContentPage.Content>
    <ListView ItemTemplate="{StaticResource alternateColorDataTemplateSelector}" />
</ContentPage.Content>

实际代码要比这复杂得多。问题是,使用这种设计,我有两个相同的网格副本,唯一的区别是背景。实际代码被复制了23行XAML,这在可维护性方面造成了一场噩梦——当一件事情需要更改时,我必须在两个地方进行更改(从标签上可以看出)

我尝试在DataTemplate之外定义网格并将其绑定到ContentView的内容,但是网格内的控件没有绑定到我的模型(ContentPage的BindingContext)。换句话说,标签不再绑定到数据。示例如下:

<Grid x:Key="mainGrid" >
    <Label Text="{Binding Data}" />
</Grid>
<DataTemplate x:Key="evenTemplate">
    <ViewCell>
        <ContentView Content={StaticResource mainGrid}" BackgroundColor="White" />
    </ViewCell>
</DataTemplate>
<DataTemplate x:Key="evenTemplate">
    <ViewCell>
        <ContentView Content={StaticResource mainGrid}" BackgroundColor="Black" />
    </ViewCell>
</DataTemplate>


因此,问题变成了,我如何做到这一点,这样网格只需要定义一次,但绑定正确,并且我有交替的行颜色?

很抱歉,我误解了您的问题。因此,您希望在多个位置重用viewcells中的网格代码。为此,我将创建一个新的Xaml文件,并将该网格的所有内容放入其中,如下所示:

<Grid ... ... x:Class="TestProject.TestGrid">
   <Label Text="{Binding Name}"/>
</Grid>

然后在我的数据模板中:

<DataTemplate x:Key="evenTemplate">
<ViewCell>
    <ContentView BackgroundColor="White">
        <local:TestGrid />
    </ContentView>
</ViewCell>
</DataTemplate>
<DataTemplate x:Key="evenTemplate">
<ViewCell>
    <ContentView BackgroundColor="Black">
        <local:TestGrid />
    </ContentView>
</ViewCell>
</DataTemplate>


我还没有在我的VisualStudio上尝试过这个,我只是在打字。您可能需要更正。

很抱歉,我误解了您的问题。因此,您希望在多个位置重用viewcells中的网格代码。为此,我将创建一个新的Xaml文件,并将该网格的所有内容放入其中,如下所示:

<Grid ... ... x:Class="TestProject.TestGrid">
   <Label Text="{Binding Name}"/>
</Grid>

然后在我的数据模板中:

<DataTemplate x:Key="evenTemplate">
<ViewCell>
    <ContentView BackgroundColor="White">
        <local:TestGrid />
    </ContentView>
</ViewCell>
</DataTemplate>
<DataTemplate x:Key="evenTemplate">
<ViewCell>
    <ContentView BackgroundColor="Black">
        <local:TestGrid />
    </ContentView>
</ViewCell>
</DataTemplate>


我还没有在我的VisualStudio上尝试过这个,我只是在打字。您可能需要进行更正。

可能重复的@Nirmal Subedi不是重复的。看看这两个帖子。首先,我尝试只在XAML中完成这项工作。另一方面,它涉及到创建DatatemplateSelector,我的代码已经做到了这一点。我的问题是创建一个更有效的解决方案。如果您有两个基于奇数/偶数行的不同视图,那么为它们创建DataTemplate会更有意义,但只是为了“只制作备用背景色”,我不建议使用两个不同的DataTemplate@近中胚层。你帮不上忙--完全重读我的帖子。你的建议正是我想问的,我讨论了我遇到的问题。我想这可能是我遗漏的一件简单的事情。我误解了你的问题,所以你可以在同一个页面XAML中定义你的网格,你可以创建一个新的对象,然后在任何你想要的地方引用它。请参阅下面的答案,如果需要,请进行更正。如果您需要更多帮助,请告诉我@Nirmal Subedi的可能副本,而不是副本。看看这两个帖子。首先,我尝试只在XAML中完成这项工作。另一方面,它涉及到创建DatatemplateSelector,我的代码已经做到了这一点。我的问题是创建一个更有效的解决方案。如果您有两个基于奇数/偶数行的不同视图,那么为它们创建DataTemplate会更有意义,但只是为了“只制作备用背景色”,我不建议使用两个不同的DataTemplate@近中胚层。你帮不上忙--完全重读我的帖子。你的建议正是我想问的,我讨论了我遇到的问题。我想这可能是我遗漏的一件简单的事情。我误解了你的问题,所以你可以在同一个页面XAML中定义你的网格,你可以创建一个新的对象,然后在任何你想要的地方引用它。请参阅下面的答案,如果需要,请进行更正。如果你需要更多的帮助,请告诉我这是有效的。谢谢它确实解决了这个问题。代码可以进一步简化——不需要围绕TestGrid进行包装。很高兴它成功了。是的,你可以用最好的方式让它工作;这只是一个例子,这很有效。谢谢它确实解决了这个问题。代码可以进一步简化——不需要围绕TestGrid进行包装。很高兴它成功了。是的,你可以用最好的方式让它工作;这只是一个例子。