В моем проекте 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, таким образом избегая помещать все в расположение контейнера.