![](/img/trans.png)
[英]How do I use Prism MVVM with a ContentView in Xamarin Forms?
[英]How can I use the Xamarin.Forms.Setter class in my own ContentView (custom control)?
我正在創建一個名為AutoAdaptingView
的ContentView
自定義控件。 基本上,它是一個可以處理兩個View
(FirstContent 和 SecondContent)的網格,它會根據方向、屏幕高度等自動將兩個View
放在兩行或兩列中。 現在,我想創建兩個附加的BindableProperty
命名為 PortraitSetters 和 LandscapeSetters,它們是List<Setter>
,以便此類的使用者可以使用 XAML 使用Setter
列表聲明 HorizontalOptions、RequestedHeight 和任何其他相關屬性的變體。 當方向改變時,該列表將被掃描,它將使用反射來設置所有需要設置的屬性。 問題是,如果我使用這樣的列表,它將無法編譯,因為它無法從string
轉換為BindableProperty
。
這是我的 BindableProperty 聲明:
//
public static readonly BindableProperty PortraitSettersProperty = BindableProperty.CreateAttached(
"PortraitSetters",
typeof(List<Setter>),
typeof(AutoAdaptingView),
null
);
public static List<Setter> GetPortraitSetters(BindableObject target)
{
return (List<Setter>)(target as View).GetValue(PortraitSettersProperty);
}
public static void SetPortraitSetters(BindableObject target, List<Setter> value)
{
(target as View).SetValue(PortraitSettersProperty, value);
}
//
public static readonly BindableProperty LandscapeSettersProperty = BindableProperty.CreateAttached(
"LandscapeSetters",
typeof(List<Setter>),
typeof(AutoAdaptingView),
null
);
public static List<Setter> GetLandscapeSetters(BindableObject target)
{
return (List<Setter>)(target as View).GetValue(LandscapeSettersProperty);
}
public static void SetLandscapeSetters(BindableObject target, List<Setter> value)
{
(target as View).SetValue(LandscapeSettersProperty, value);
}
這是一個如何使用它的示例:
<ctrl:AutoAdaptingView>
<ctrl:AutoAdaptingView.FirstContent>
<StackLayout Orientation="Vertical"
Spacing="16">
<ctrl:AutoAdaptingView.PortraitSetters>
<Setter Property="HorizontalOptions" Value="Center"/>
<Setter Property="VerticalOptions" Value="Start"/>
<Setter Property="Margin" Value="16, 100, 16, 16"/>
</ctrl:AutoAdaptingView.PortraitSetters>
<ctrl:AutoAdaptingView.LandscapeSetters>
<Setter Property="HorizontalOptions" Value="Center"/>
<Setter Property="VerticalOptions" Value="Center"/>
<Setter Property="Margin" Value="16"/>
</ctrl:AutoAdaptingView.LandscapeSetters>
<!-- actual content here -->
這就是問題所在:
Cannot convert "HorizontalOptions" into Xamarin.Forms.BindableProperty
顯然,我不希望 XAML 神奇地理解Property
字段指的是StackLayout
BindableProperty,但就像Style
類具有TargetType
屬性一樣,它允許它自動將屬性名稱字符串轉換為實際的BindableProperty
對象,應該有一種方法可以讓我實現相同的方法。
我想到的一個解決方案是創建我自己的 Setter 類,而不是BindableProperty
對象,它只需要一個屬性名稱(因為這是我在實現中實際需要的),但是我不需要創建轉換器為了轉換值(即"16, 100, 16, 16"
到new Margin(16, 100, 16, 16)
)?
最簡單的解決方案是改用一個事件,消費者將在后面的代碼中處理該事件,但這會損失代碼資源分離的優勢。
您可以在 App.xaml 中定義您的樣式(全局樣式)
<Style x:Key="portraitStyle" TargetType="custom:LabelEntry">
<Setter Property="HorizontalOptions" Value="Center"/>
<Setter Property="VerticalOptions" Value="Start"/>
<Setter Property="Margin" Value="16, 100, 16, 16"/>
</Style>
並且,在您的視圖綁定中
Style="{Binding YourProperty , Converter={ StaticResource ConvertStyleKey }}"
帶轉換器用於:
public class ConvertStyle : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
valueType = (YourModel)value
if (valueType.YourProperty)
{
return Application.Current.Resources["portraitStyle"] as Style;
}
else
{
//other style
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.