【问题标题】:How to use BindingContext in Xamarin如何在 Xamarin 中使用 BindingContext
【发布时间】:2020-03-22 23:24:50
【问题描述】:

我是 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"/>

但没有运气,然后我尝试使用自动属性

public string ImagePath {get;set;}

这仅适用于

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

【问题讨论】:

  • 那么成功了吗?这里有什么问题...
  • 您使用的是代码隐藏还是视图模型?你需要实现 OnPropertyChanged();

标签: c# xaml xamarin.forms


【解决方案1】:

根据你的描述,我不知道你是怎么实现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 已更改。如果我们去我们的属性,我们现在需要更新它,以引发这个事件,每次属性被改变。

从您的代码中,您没有在 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

【讨论】:

  • 因为我在不同的班级需要它
  • @HristoIvanov 你是什么意思?您能否提供有关您的问题的更详细信息,现在我不确定您有什么问题。
  • 我有不同的类名为 ImageOnClick 并想与 MyMainPage 连接
  • @HristoIvanov 你说你有不同的类,所有ImageOnClick,如果你这样做,我猜你可能有错误消息。你想在ImageOnClick类中添加ImagePath,然后想使用mvvm绑定内容页面的模式?
  • 是的,这正是我一直想要的
【解决方案2】:

您的初始代码是正确的,但您可以将 _imagePath 设置为 Auto 属性,如下所示:

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


原因

public string ImagePath {get;set;}

不起作用是因为您需要在 setter 中有 OnPropertyChanged()。

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 2020-01-26
    • 2022-01-22
    • 2016-12-26
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多