BindableProperty для источника изображения в представлении содержимого - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь связать источник 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>

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы устанавливаете 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 к Image.Поскольку Path привязки равен ImageSourceOf, Image.Source будет привязан к View.ImageSourceOf.

0 голосов
/ 01 марта 2019
Content.BindingContext = this;

Решил мою проблему.Но есть ли способ сделать это лучше?Добавить комментарий, пожалуйста.

...