Могу ли я заполнить метку в моем CollectionView значением вне списка ItemsSource, которое заполняет представление? - PullRequest
0 голосов
/ 25 мая 2020

У меня есть метка в моем CollectionView, которую мне нужно заполнить значением вне списка ItemsSource List, которое заполняет представление. Следующий код является примером того, что я пытаюсь выполнить sh, но кажется, что CollectionView ограничивает контекст привязки только списком Items. Я попытался назвать метку и установить ее в моем коде c#, но, похоже, я не могу получить доступ к метке в c#. Полагаю, я мог бы построить всю страницу в c# вместо использования .xaml, но, в отличие от этого примера, мой фактический код использует несколько шаблонов и селектор шаблонов. Если бы я мог понять это, не переписывая часы кода, я бы предпочел это.

ItemsPage.xaml

<ContentPage 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"
             mc:Ignorable="d"
             x:Class="TabTest.Views.ItemsPage"
             Title="{Binding Title}"
             x:Name="BrowseItemsPage">

    <ContentPage.ToolbarItems>
        <ToolbarItem Text="Add" Clicked="AddItem_Clicked" />
    </ContentPage.ToolbarItems>
    <StackLayout Padding="10">
        <Label Text="{Binding TestVal}" FontSize="16" HeightRequest="20" />
        <!-- ^^^^ This label displays just as expected -->
        <RefreshView IsRefreshing="{Binding IsBusy, Mode=TwoWay}" Command="{Binding LoadItemsCommand}">
            <CollectionView x:Name="ItemsCollectionView"
                ItemsSource="{Binding Items}">
                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <StackLayout Padding="10">
                            <Label x:Name="TestV" Text="{Binding Path=BindingContext.TestVal}" />
                            <!-- ^^^^ I want this Label to display the TestVal string in the ViewModel -->
                            <Label Text="{Binding Text}" 
                                d:Text="{Binding .}"
                                LineBreakMode="NoWrap" 
                                Style="{DynamicResource ListItemTextStyle}" 
                                FontSize="16" />
                            <Label Text="{Binding Description}" 
                                d:Text="Item descripton"
                                LineBreakMode="NoWrap"
                                Style="{DynamicResource ListItemDetailTextStyle}"
                                FontSize="13" />
                            <StackLayout.GestureRecognizers>
                                <TapGestureRecognizer NumberOfTapsRequired="1" Tapped="OnItemSelected"></TapGestureRecognizer>
                            </StackLayout.GestureRecognizers>
                        </StackLayout>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </RefreshView>
    </StackLayout>
</ContentPage>

ItemsViewModel.cs

namespace TabTest.ViewModels
{
    public class ItemsViewModel : BaseViewModel
    {
        public ObservableCollection<Item> Items { get; set; }
        public Command LoadItemsCommand { get; set; }

        private string testVal;     
        public string TestVal       // I want the value of this variable in that Label
        {
            get
            {
                return testVal;
            }
            set
            {
                testVal = value;
            }
        }

        public ItemsViewModel()
        {
            Title = "Browse";
            TestVal = "Value123";

            Items = new ObservableCollection<Item>();
            LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());


            MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
            {
                var newItem = item as Item;
                Items.Add(newItem);
                await DataStore.AddItemAsync(newItem);
            });
        }

        async Task ExecuteLoadItemsCommand()
        {
            IsBusy = true;

            try
            {
                Items.Clear();
                var items = await DataStore.GetItemsAsync(true);
                foreach (var item in items)
                {
                    Items.Add(item);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
            }
            finally
            {
                IsBusy = false;
            }
        }
    }
}

1 Ответ

0 голосов
/ 13 июля 2020

В итоге я использовал ресурс Dynami c в Xaml и использовал код для изменения ресурса, когда он должен был измениться. 1006 *

Application.Current.Resources["TestValue"] = NewValue;

App.xaml:

<x:String x:Key="TestValue">Value123</x:String>
...