Как использовать BindingContext в Xamarin - PullRequest
0 голосов
/ 23 марта 2020

Я новичок в Xamarin, но я попытался использовать BindingContext, чтобы установить путь к изображению. Сначала я попытался использовать

private string _imagePath;
public string ImagePath
{
    get
    {
        return _imagePath;
    }
    set
    {
        if (_imagePath != value)
        {
            _imagePath = value;
            OnPropertyChanged();
        }
    }
}

. , .

ImagePath = "TriangleSide_A.png";

. , .

<Image Source="{Binding  ImagePath}" HeightRequest="300" WidthRequest="300"/>

Но не повезло, тогда я попытался с Auto Property

public string ImagePath {get;set;}

Это работает только с

public string ImagePath {get;} = "TriangleSide_A.png";

Ответы [ 2 ]

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

Согласно вашему описанию, я не знаю, как вы реализуете интерфейс INotifyPropertyChanged, в общем, мне это нравится:

public class ViewModelBase : INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged; 
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

RaisePropertyChanged нравится ваш метод OnPropertyChanged с измененным PropertyName. Если мы добавим go к нашему свойству, теперь нам нужно обновить его, чтобы вызывать это событие каждый раз, когда свойство изменяется.

Из вашего кода вы не добавляете имя свойства в свой OnPropertyChanged, поэтому ImagePath не может быть обновлен.

Пожалуйста, посмотрите следующий код:

 <StackLayout>
        <Image
            HeightRequest="300"
            Source="{Binding ImagePath}"
            WidthRequest="300" />

        <Button
            x:Name="btn1"
            Clicked="Btn1_Clicked"
            Text="change image source" />
    </StackLayout>

 public partial class Page32 : ContentPage, INotifyPropertyChanged
{
    private string _imagePath;
    public string ImagePath
    {
        get { return _imagePath; }
        set
        { 
            if (_imagePath != value)
            {
                _imagePath = value;
                RaisePropertyChanged("ImagePath");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;      
    public void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public Page32()
    {
        InitializeComponent();
        ImagePath = "a11.jpg";
        this.BindingContext = this;
    }

    private void Btn1_Clicked(object sender, EventArgs e)
    {
        ImagePath = "a12.jpg";
    }
}

Обновление:

Если вы хотите использовать привязку в режиме mvvm, я делаю код, который вы можете посмотреть:

Это модель ImageOnClick, содержит некоторые свойства .

 public class ImageOnClick:ViewModelBase
{
    private string _imagePath;
    public string ImagePath
    {
        get { return _imagePath; }
        set
        {

            if (_imagePath != value)
            {
                _imagePath = value;
                RaisePropertyChanged("ImagePath");
            }
        }
    }
}

Теперь привязка этой модели к контентной странице

 public partial class Page32 : ContentPage
{
    private ImageOnClick imagemodel;       
    public Page32()
    {
        InitializeComponent();

        imagemodel = new ImageOnClick() { ImagePath = "a11.jpg" };

        this.BindingContext = imagemodel;
    }

    private void Btn1_Clicked(object sender, EventArgs e)
    {
       imagemodel.ImagePath = "a12.jpg";
    }
}

Об привязке mvvm вы также можете посмотреть:

https://docs.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-bindings-to-mvvm

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

Ваш исходный код правильный, но вы можете установить для _imagePath значение Auto Property следующим образом:

private string _imagePath { get; set; }
public string ImagePath
{
    get
    {
        return _imagePath;
    }
    set
    {
        if (_imagePath != value)
        {
            _imagePath = value;
            OnPropertyChanged();
        }
    }
}


Причина, по которой

public string ImagePath {get;set;}

не работает, заключается в том, что вам нужно иметь OnPropertyChanged () в установщике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...