Xamarin Forms XAML: еще один вопрос синтаксиса Binding - PullRequest
0 голосов
/ 05 марта 2020

В моем проекте Xamarin Forms я использую следующий код для предоставления макетных данных для средства предварительного просмотра xaml во время разработки:

C#:

namespace MyApp.Data
{
    public class StaticData
    {
        private static AppMockData mockData;
        public static AppMockData MockData => mockData ?? (mockData = new MockData());

        public class MockData
        {
            public List<MyObj> LstObj { get; set; }
                = new List<MyObj>()
                {
                    new MyObj() { P1 = "V1", P2 = "V2" },
                    new MyObj() { P1 = "V1", P2 = "V2" },
                    new MyObj() { P1 = "V1", P2 = "V2" }
                };

            public MyObj SingleObj { get; set; } = new MyObj() { P1 = "V1", P2 = "V2" };
        }
    }
}

XAML:

<ContentPage xmlns:data="clr-namespace:MyApp.Data"
             BindingContext="{x:Static data:StaticData.MockData}"
             ... >  

<ListView x:Name="MyList" ItemsSource="{Binding LstObj}">
    ...
    <Label Text="{Binding P1}" />
    <Label Text="{Binding P2}" />
    ...
</ListView>

Затем во время выполнения:

var actualListData = GetDataFromDB(); // obj returned is of type List<MyObj>
MyList.ItemsSource = actualListData;

Это работает нормально.

Я хотел бы сделать то же самое с SingleObj, то есть с одним объектом, а не с список. Я пробовал что-то вроде:

<ContentPage xmlns:data="clr-namespace:MyApp.Data"
             BindingContext="{x:Static data:StaticData.MockData.SingleObj}"
             ... >

<Label Text="{Binding P1}" />
<Label Text="{Binding P2}" />

и в коде:

var actualObj = GetDataFromDB(); // obj returned is of type MyObj
this.BindingSource = actualObj;

Это работает во время выполнения, но не во время разработки: "{x:Static data:StaticData.MockData.SingleObj}" не распознается как правильное выражение.

Единственный способ заставить его работать как во время разработки, так и во время выполнения:

<ContentPage xmlns:data="clr-namespace:MyApp.Data"
             BindingContext="{x:Static data:StaticData.MockData}"
             ... >

<StackLayout x:Name="MyStackLayout" BindingContext="{Binding SingleObj}">
    <Label Text="{Binding P1}" />
    <Label Text="{Binding P2}" />
</StackLayout>

и:

var actualObj = GetDataFromDB(); // obj returned is of type MyObj
MyStackLayout.BindingContext = actualObj;    

Таким образом У меня есть StackLayout (используется только для целей привязки), чей BindingContext является свойством MockData во время разработки, и фактический объект во время выполнения.

Интересно, существует ли синтаксис для указания SingleObj непосредственно в ContentPage BindingContext, таким образом избегая помещать все в расположение контейнера.

1 Ответ

0 голосов
/ 05 марта 2020

добавьте SingleObj в ваше выражение пути привязки

<ContentPage xmlns:data="clr-namespace:MyApp.Data"
             BindingContext="{x:Static data:StaticData.ViewModel}"
             ... >

<StackLayout>
    <Label Text="{Binding SingleObj.P1}" />
    <Label Text="{Binding SingleObj.P2}" />
</StackLayout>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...