Определить вид списка в файле ресурсов, который можно использовать в разных местах с одной и той же моделью - PullRequest
0 голосов
/ 18 января 2020

Я создал следующий ListView для отображения данных

<dataControls:RadListView x:Name="ItemsListView" 
                                      ItemsSource="{Binding StudyResults,Mode=TwoWay}"
                                      MinimumHeightRequest="70"
                                      HeightRequest="{Binding Height}"
                                      SelectedItem="{Binding SelectedItem,Mode=TwoWay}">
                <dataControls:RadListView.ItemTemplate>
                    <DataTemplate>
                        <listView:ListViewTemplateCell>
                            <listView:ListViewTemplateCell.View>
                                <Grid Padding="2,2,2,5" HorizontalOptions="FillAndExpand">
                                    <StackLayout Padding="5,1,1,5" Grid.Column="0">
                                        <Grid >
                                            <Grid.ColumnDefinitions>
                                                <ColumnDefinition Width="*"/>
                                                <ColumnDefinition Width="Auto"/>
                                            </Grid.ColumnDefinitions>
                                            <maxline:XfMaxLinesLabel MaxLines="2" Text="{Binding BriefTitle, Mode=TwoWay}" Style="{StaticResource ListViewLabelStyle}" TextColor="Black"/>
                                        </Grid>
                                        <StackLayout Padding="0,0,0,0" HorizontalOptions="Fill">
                                            <BoxView Margin="0"
                                                     BackgroundColor="Gray"
                                                     HeightRequest=".25" />
                                            <Label Text="{Binding ClosestFacility.Name, Mode=TwoWay}" Style="{StaticResource ListViewLabelStyle}"/>
                                            <BoxView Margin="0"
                                                     BackgroundColor="Gray"
                                                     HeightRequest=".25" />
                                        </StackLayout>
                                    </StackLayout>
                                </Grid>
                            </listView:ListViewTemplateCell.View>
                        </listView:ListViewTemplateCell>
                    </DataTemplate>
                </dataControls:RadListView.ItemTemplate>
            </dataControls:RadListView>

Я хочу повторно использовать ту же самую разметку ListView + в других экранах / представлениях, просто с другим ItemsSource он будет привязан к той же модели , Мне нужно использовать разные источники элементов на разных экранах.

Есть ли лучший способ создать какой-либо тип ресурса, чтобы я мог использовать его повторно?

Ответы [ 2 ]

1 голос
/ 19 января 2020

По мнению Ивана, вы можете установить DataTemplate в ContentPage.Resource или ResourceDictionary, например, такой код:

<ContentPage.Resources>

    <DataTemplate x:Key="Radtemplate">
        <listView:ListViewTemplateCell>
            <listView:ListViewTemplateCell.View>
                <Grid Padding="2,2,2,5" HorizontalOptions="FillAndExpand">
                    <StackLayout Padding="5,1,1,5" Grid.Column="0">
                        <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>
                            <maxline:XfMaxLinesLabel MaxLines="2" Text="{Binding BriefTitle, Mode=TwoWay}" Style="{StaticResource ListViewLabelStyle}" TextColor="Black"/>
                        </Grid>
                        <StackLayout Padding="0,0,0,0" HorizontalOptions="Fill">
                            <BoxView Margin="0"
                                                 BackgroundColor="Gray"
                                                 HeightRequest=".25" />
                            <Label Text="{Binding ClosestFacility.Name, Mode=TwoWay}" Style="{StaticResource ListViewLabelStyle}"/>
                            <BoxView Margin="0"
                                                 BackgroundColor="Gray"
                                                 HeightRequest=".25" />
                        </StackLayout>
                    </StackLayout>
                </Grid>
            </listView:ListViewTemplateCell.View>
        </listView:ListViewTemplateCell>
    </DataTemplate>
</ContentPage.Resources>

<StackLayout>
    <!--  Place new controls here  -->

    <dataControls:RadListView x:Name="ItemsListView" ItemTemplate="{StaticResource Radtemplate}"
                                  ItemsSource="{Binding StudyResults,Mode=TwoWay}"
                                  MinimumHeightRequest="70"
                                  HeightRequest="{Binding Height}"
                                  SelectedItem="{Binding SelectedItem,Mode=TwoWay}">

    </dataControls:RadListView>
</StackLayout>

О подробной информации о DateTemplate вы можете посмотреть в следующей статье:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/templates/data-templates/creating

Обновление: Поскольку RadListView - это сторонний элемент управления, я не могу установить его, поэтому в качестве примера я использую ListView, это то же самое, вы можете посмотреть, как использовать TapGestureRecognizer.

Пожалуйста, сначала дайте странице страницу x: name = listview, затем

<ContentPage
x:Class="demo3.listviewsample.Page2"
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:d="http://xamarin.com/schemas/2014/forms/design"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Name="listviewpage"
mc:Ignorable="d">
<ContentPage.Resources>
    <DataTemplate x:Key="datatemplate1">
        <ViewCell>
            <StackLayout Margin="5" VerticalOptions="FillAndExpand">
                <BoxView BackgroundColor="AliceBlue" HeightRequest="30" />
                <Label Text="{Binding username}">
                    <Label.GestureRecognizers>
                        <TapGestureRecognizer Command="{Binding BindingContext.command, Source={x:Reference listviewpage}}" CommandParameter="{Binding Email}" />
                    </Label.GestureRecognizers>
                </Label>
            </StackLayout>
        </ViewCell>
    </DataTemplate>
</ContentPage.Resources>
<ContentPage.Content>
    <StackLayout>
        <ListView
            HasUnevenRows="True"
            ItemTemplate="{StaticResource datatemplate1}"
            ItemsSource="{Binding models}" />
    </StackLayout>
</ContentPage.Content>

Или вы можете дать ViewCell сначала x: Name viewcell1, затем:

<ContentPage.Resources>
    <DataTemplate x:Key="datatemplate1">
        <ViewCell x:Name="viewcell">
            <StackLayout Margin="5" VerticalOptions="FillAndExpand">
                <BoxView BackgroundColor="AliceBlue" HeightRequest="30" />
                <Label Text="{Binding username}">
                    <Label.GestureRecognizers>
                        <TapGestureRecognizer Command="{Binding Parent.BindingContext.command, Source={x:Reference viewcell}}" CommandParameter="{Binding Email}" />
                    </Label.GestureRecognizers>
                </Label>
            </StackLayout>
        </ViewCell>
    </DataTemplate>
</ContentPage.Resources>

 public partial class Page2 : ContentPage
{
    public ObservableCollection<model3> models { get; set; }
    public RelayCommand1 command { get; set; }
    public Page2()
    {
        InitializeComponent();
        models = new ObservableCollection<model3>()
        {
            new model3(){username="cherry",Email="cherry@outlook.com"},
            new model3(){username="barry",Email="barry@outlook.com"}
        };
        command = new RelayCommand1(obj => method1((string)obj));
        this.BindingContext = this;       
    }

    private void method1(string str)
    {
        Console.WriteLine("the email is {0}",str);
    }
}
public class model3
{
    public string username { get; set; }
    public string Email { get; set; }
}

Вот команда, которая наследует ICommand:

public class RelayCommand1 : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;

    public RelayCommand1(Action<object> execute)
        : this(execute, null)
    {
    }

    public RelayCommand1(Action<object> execute, Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public bool CanExecute(object parameter)
    {
        return _canExecute == null ? true : _canExecute(parameter);
    }

    public event EventHandler CanExecuteChanged;


    public void Execute(object parameter)
    {
        _execute(parameter);
    }
}

Когда я нажимаю метку, она работает нормально.

1 голос
/ 19 января 2020

Вы можете установить DataTemplate в качестве ресурса, который будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...