内容视图中图像源的可绑定属性
BindableProperty for Image Source in contentview
我正在尝试绑定我的 Contentview 中的 DogImage 源。我正在尝试构建可重用的视图对象,例如框架按钮。我只需要从 contentview 之外给他们图像和文本。我正在使用资源文件夹中的图像。
这是我的 contentView
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="PawsApp.Views.AboutMyDogViews.DogsBreedPicker"
BindingContext="{Binding .}">
<ContentView.Content>
<StackLayout x:Name="breedStack" Margin="30,2,30,2">
<Frame HeightRequest="64" CornerRadius="8" BorderColor="White" HasShadow="False" BackgroundColor="White"
VerticalOptions="FillAndExpand" Padding="18,0,18,0">
<Frame.Content>
<StackLayout Orientation="Vertical" VerticalOptions="CenterAndExpand">
<Grid ColumnSpacing="18">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="9*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image x:Name="DogImage" Source="{Binding ImageSourceOf}" Grid.Row="0" Grid.Column="0" ></Image>
<Label x:Name="breedSelector" Text="Breed" FontSize="Medium" TextColor="#5f5d70" Grid.Row="0" Grid.Column="1">
</Label>
</Grid>
</StackLayout>
</Frame.Content>
</Frame>
</StackLayout>
</ContentView.Content>
</ContentView>
这是CS文件
public partial class DogsBreedPicker : ContentView
{
public static readonly BindableProperty ImageSourceProperty =
BindableProperty.Create("ImageSourceOf", typeof(ImageSource), typeof(DogsBreedPicker));
public ImageSource ImageSourceOf
{
get { return GetValue(ImageSourceProperty) as ImageSource; }
set { SetValue(ImageSourceProperty, value);}
}
public DogsBreedPicker()
{
InitializeComponent ();
BindingContext = ImageSourceOf;
}
}
这就是我想要使用它的方式。
<views:DogsBreedPicker ImageSourceOf="dog" TextOf="Breed Selector" x:Name="DogBreed" ></views:DogsBreedPicker>
Content.BindingContext = this;
解决了我的问题。但是有没有办法让它变得更好呢?请添加评论。
您正在构造函数中将 BindingContext
设置为 ImageSourceOf
。无论如何,此时没有设置属性,因此 ImageSourceOf
仍然是 null
。但是,在这种情况下您不需要使用 BindingContext
,因为您可以直接绑定到 ImageSourceOf
属性:
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="PawsApp.Views.AboutMyDogViews.DogsBreedPicker"
x:Name="View">
<!-- Elided all the other stuff -->
<Image x:Name="DogImage" Source="{Binding ImageSourceOf, Source={x:Reference View}}" Grid.Row="0" Grid.Column="0" />
</ContentView>
从构造函数中删除 BindingContext
的赋值。
为什么这样做有效?
所有绑定的默认源是 BindingContext
(视图的,传播到所有子视图)。无论如何,您绝不限于将 BindingContext
作为绑定的来源,而是可以将绑定的 Source
设置为另一个对象。在这种情况下,我们通过其名称引用视图(我们将其命名为 View
和 x:Name="View"
)并将其用作 Source
的绑定源。 24=]。因为绑定的Path
是ImageSourceOf
,所以Image.Source
会绑定到View.ImageSourceOf
.
我正在尝试绑定我的 Contentview 中的 DogImage 源。我正在尝试构建可重用的视图对象,例如框架按钮。我只需要从 contentview 之外给他们图像和文本。我正在使用资源文件夹中的图像。
这是我的 contentView
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="PawsApp.Views.AboutMyDogViews.DogsBreedPicker"
BindingContext="{Binding .}">
<ContentView.Content>
<StackLayout x:Name="breedStack" Margin="30,2,30,2">
<Frame HeightRequest="64" CornerRadius="8" BorderColor="White" HasShadow="False" BackgroundColor="White"
VerticalOptions="FillAndExpand" Padding="18,0,18,0">
<Frame.Content>
<StackLayout Orientation="Vertical" VerticalOptions="CenterAndExpand">
<Grid ColumnSpacing="18">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="9*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image x:Name="DogImage" Source="{Binding ImageSourceOf}" Grid.Row="0" Grid.Column="0" ></Image>
<Label x:Name="breedSelector" Text="Breed" FontSize="Medium" TextColor="#5f5d70" Grid.Row="0" Grid.Column="1">
</Label>
</Grid>
</StackLayout>
</Frame.Content>
</Frame>
</StackLayout>
</ContentView.Content>
</ContentView>
这是CS文件
public partial class DogsBreedPicker : ContentView
{
public static readonly BindableProperty ImageSourceProperty =
BindableProperty.Create("ImageSourceOf", typeof(ImageSource), typeof(DogsBreedPicker));
public ImageSource ImageSourceOf
{
get { return GetValue(ImageSourceProperty) as ImageSource; }
set { SetValue(ImageSourceProperty, value);}
}
public DogsBreedPicker()
{
InitializeComponent ();
BindingContext = ImageSourceOf;
}
}
这就是我想要使用它的方式。
<views:DogsBreedPicker ImageSourceOf="dog" TextOf="Breed Selector" x:Name="DogBreed" ></views:DogsBreedPicker>
Content.BindingContext = this;
解决了我的问题。但是有没有办法让它变得更好呢?请添加评论。
您正在构造函数中将 BindingContext
设置为 ImageSourceOf
。无论如何,此时没有设置属性,因此 ImageSourceOf
仍然是 null
。但是,在这种情况下您不需要使用 BindingContext
,因为您可以直接绑定到 ImageSourceOf
属性:
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="PawsApp.Views.AboutMyDogViews.DogsBreedPicker"
x:Name="View">
<!-- Elided all the other stuff -->
<Image x:Name="DogImage" Source="{Binding ImageSourceOf, Source={x:Reference View}}" Grid.Row="0" Grid.Column="0" />
</ContentView>
从构造函数中删除 BindingContext
的赋值。
为什么这样做有效?
所有绑定的默认源是 BindingContext
(视图的,传播到所有子视图)。无论如何,您绝不限于将 BindingContext
作为绑定的来源,而是可以将绑定的 Source
设置为另一个对象。在这种情况下,我们通过其名称引用视图(我们将其命名为 View
和 x:Name="View"
)并将其用作 Source
的绑定源。 24=]。因为绑定的Path
是ImageSourceOf
,所以Image.Source
会绑定到View.ImageSourceOf
.