Xamarin.forms Xamarin绑定DataContext对象路径=。部队更新

Xamarin.forms Xamarin绑定DataContext对象路径=。部队更新,xamarin.forms,label,converter,datacontext,Xamarin.forms,Label,Converter,Datacontext,我有一个viewmodel,具有如下两个属性: public class MyViewModel : INotifyPropertyChanged { protected string _aaa; protected string _bbb; public string AAA { get { return _aaa; } set { _aaa = value; Ra

我有一个viewmodel,具有如下两个属性:

public class MyViewModel : INotifyPropertyChanged
{
    protected string _aaa;
    protected string _bbb;

    public string AAA
    {
        get { return _aaa; }
        set
        {
            _aaa = value;
            RaisePropertyChanged(nameof(AAA));
        }
    }
    public string BBB
    {
        get { return _bbb; }
        set
        {
            _bbb = value;
            RaisePropertyChanged(nameof(BBB));
        }
    }

 /// etc.…..
}
我还有一个视图,其BidingContext是MyViewModel类型的对象:

<Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

         <Label Grid.Row="0" x:Name="Label1" Text="{Binding AAA}" />
         <Label Grid.Row="1" x:Name="Label2" Text="{Binding Path=. , Converter={StaticResource MyConverter}}" />
 </Grid>

转换器使用属性AAA和BBB返回字符串值

初始化时一切正常。当AAA属性更改时,label1相应地更改其值,但是如果AAA或BBB更改,我需要强制Label2通过调用转换器来更新其值。但是由于绑定是直接使用datacontext(Path=)完成的,而不是它的一个属性,因此它实际上从不更新它的文本属性

有人知道如何解决我的pb吗?
提前感谢您的帮助。

在视图模型中添加一个属性,比如说
Self
,该属性返回对其自身实例的引用;并确保在更新
AAA
BBB
时引发相同的属性更改事件

public class MyViewModel : INotifyPropertyChanged
{
    protected string _aaa;
    protected string _bbb;

    public string AAA
    {
        get { return _aaa; }
        set
        {
            _aaa = value;
            RaisePropertyChanged(nameof(AAA));
            RaisePropertyChanged(nameof(Self));
        }
    }
    public string BBB
    {
        get { return _bbb; }
        set
        {
            _bbb = value;
            RaisePropertyChanged(nameof(BBB));
            RaisePropertyChanged(nameof(Self));
        }
    }

    public MyViewModel Self
    {
        get { return this; }
    }

 /// etc.…..
}
现在,您可以将XAML更改为以下内容:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

     <Label Grid.Row="0" x:Name="Label1" Text="{Binding AAA}" />
     <Label Grid.Row="1" x:Name="Label2" Text="{Binding Path=Self, Converter={StaticResource MyConverter}}" />
</Grid>


转换器的作用是什么?如果只是格式化字符串,我建议放置另一个字符串属性来创建所需的字符串,当
AAA
BBB
更改时,您也可以
RaisePropertyChanged
对该属性进行更改。感谢您的回复,但我考虑了这个解决方案,但是我需要使用转换器更新Label2值。有没有办法强制label2更新其在Xamarin中的值?我不确定有什么方法可以
在ViewModel实例上提升属性更改。如果可能的话,我建议尝试使用单独的财产。如果这不可能,我不知道如何让
Label2
正确更新..我不确定您想做什么。。。要重新设置它,您可以通过执行
BindingContext=this再次设置
BindingContext
但这将再次绑定所有内容。所以做得太多可能会导致性能问题。谢谢大家的建议。我想可能会使用UpdateSourceEventName,但我没有找到很多关于它的文档@艾达,我会试试你的建议,谢谢。我做完了就告诉你。