XAML 'local:Class1'的使用方式类似标记延伸,但是..是否有问题

6yoyoihd  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(115)

我有一个ContentPage,上面有两个ContentView,我想为每个ContentView设置绑定上下文。

<Label 
    BindingContext="{Binding Source ={local:ViewModel1 }}" 
    Text="{Binding LabelText}" 
    HorizontalOptions="Center" 
    HorizontalTextAlignment="Center" />
<Label 
    BindingContext="{Binding Source ={local:ViewModel2 }}" 
    Text="{Binding LabelText}" 
    HorizontalOptions="Center" 
    HorizontalTextAlignment="Center" />

它是工作,但我有错误-

'local:ViewModel1' is used like a markup extension but
 'local:ViewModel2' is used like a markup extension but

毫无理由

jobtbby3

jobtbby31#

您可以尝试以下代码。
ViewModel1.cs:

class ViewModel1 : INotifyPropertyChanged
{
    private string _labelText;
    public string LabelText
    {
        set
        {
            if (_labelText != value)
            {
                _labelText = value;
                if (PropertyChanged != null)
               {
                    PropertyChanged(this, new PropertyChangedEventArgs("LabelText"));
                }
            }
        }
        get
        {
            return _labelText;
        }
    }

   public event PropertyChangedEventHandler PropertyChanged;
    public ViewModel1()
    {
        this.LabelText = "hello_1";
    }
}

ViewModel2.cs:

class ViewModel2 : INotifyPropertyChanged
{
    private string _labelText2;
    public string LabelText
    {
        set
        {
            if (_labelText2 != value)
            {
                _labelText2 = value;
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs("LabelText"));
                }
            }
        }
        get
        {
            return _labelText2;
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    public ViewModel2()
    {
        this.LabelText = "hello_2";
    }
 }

XAML:

<ContentView>
    <StackLayout>
        <Label
            FontSize="Large"
            Text="{Binding LabelText}">
            <Label.BindingContext>
                <local:ViewModel1 />
            </Label.BindingContext>
        </Label>
        <Label
            FontSize="Large"
            Text="{Binding LabelText}">
            <Label.BindingContext>
                <local:ViewModel2 />
            </Label.BindingContext>
        </Label>
    </StackLayout>
</ContentView>

有关如何设置Label的BindingContext的详细信息,请参阅MS docs. https://learn.microsoft.com/en-us/xamarin/xamarin-forms/xaml/xaml-basics/data-bindings-to-mvvm

xwmevbvl

xwmevbvl2#

选项1:XML属性语法中的BindingContext

若要隐藏警告,而且如果不需要使用XML属性语法,请将BindingContext="{Binding Source ={local:ViewModel1}}"转换为Map的property项目语法,如下所示。

<Label
    Text="{Binding LabelText}" 
    HorizontalOptions="Center" 
    HorizontalTextAlignment="Center">
    <Label.BindingContext>local:ViewModel1</Label.BindingContext>
</Label>

备注:

因为BindingContextobject类型,所以你不需要Binding标记扩展。你的BindingContext="{Binding Source ={local:ViewModel1}}"可以简化为BindingContext="{local:ViewModel1}"。但是,这两个都触发了你在问题中提到的相同的警告(而不是错误)。

选项2:使用资源字典

将以下代码添加到Label的祖先中。

<AnyAncestorYouChoose.Resources>
    <local:ViewModel1 x:Key="vm1"/>
</AnyAncestorYouChoose.Resources>

如果您不知道选择哪个祖先,ContentPage是可以的,因此标记变为

<ContentPage.Resources>
    <local:ViewModel1 x:Key="vm1"/>
</ContentPage.Resources>

现在您可以按如下方式使用静态资源。

<Label BindingContext="{StaticResource Key=vm1}"
    Text="{Binding LabelText}" 
    HorizontalOptions="Center" 
    HorizontalTextAlignment="Center">
</Label>

BindingContext="{StaticResource Key=vm1}"也可以简化为BindingContext="{StaticResource vm1}",因为Key被标记为StaticResourceExtension的内容属性。

相关问题