gpt4 book ai didi

xamarin - Prism 和控制模板

转载 作者:行者123 更新时间:2023-12-05 06:34:15 26 4
gpt4 key购买 nike

我正在尝试使用 Prism 重写使用 ControlTemplates 的示例“SimpleThemeWithTemplateBinding”。我还添加了一个简单的

 HeaderText = "changed";

在按钮中更改 ControlTemplate 中的 HeaderText,并且在原始示例中有效。

所以我在我的 app.xaml 中复制了模板:

<ControlTemplate x:Key="TealTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.1*" />
<RowDefinition Height="0.8*" />
<RowDefinition Height="0.1*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.05*" />
<ColumnDefinition Width="0.95*" />
</Grid.ColumnDefinitions>
<BoxView Grid.ColumnSpan="2" Color="Teal" />
<Label Grid.Column="1" Text="{TemplateBinding BindingContext.HeaderText}" TextColor="White" VerticalOptions="Center" />
<ContentPresenter Grid.Row="1" Grid.ColumnSpan="2" />
<BoxView Grid.Row="2" Grid.ColumnSpan="2" Color="Teal" />
<Label Grid.Row="2" Grid.Column="1" Text="(c) Xamarin 2016" TextColor="White" VerticalOptions="Center" />
</Grid>
</ControlTemplate>

刚刚改变{TemplateBinding HeaderText}到{TemplateBinding BindingContext.HeaderText}

查看:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
prism:ViewModelLocator.AutowireViewModel="True"
x:Class="TestAppNSPrism7.Views.PrismContentPage9">
<ContentPage.Content>
<ContentView x:Name="contentView" Padding="0,0,0,0" ControlTemplate="{StaticResource TealTemplate}" >
<StackLayout>
<Label Text="Welcome to Xamarin.Forms! page1"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
<Label Text="Buazz"
VerticalOptions="CenterAndExpand"
HorizontalOptions="CenterAndExpand" />
<Button Command="{Binding ButtonChangeValueCommand}" Text="Change value" ></Button>
</StackLayout>
</ContentView>
</ContentPage.Content>
</ContentPage>

View 模型:

public class PrismContentPage9ViewModel : ViewModelBase
{

ControlTemplate tealTemplate;

private string _headerText = "test";
public string HeaderText
{
get
{
return _headerText;
}
set { SetProperty(ref _headerText, value); }
}

public PrismContentPage9ViewModel(INavigationService navigationService) : base(navigationService)
{
tealTemplate = (ControlTemplate)Application.Current.Resources["TealTemplate"];
}

private DelegateCommand _buttonChangeValueCommand;
public DelegateCommand ButtonChangeValueCommand =>
_buttonChangeValueCommand ?? (_buttonChangeValueCommand = new DelegateCommand(ExecuteButtonChangeValueCommand));

void ExecuteButtonChangeValueCommand()
{
HeaderText = "changed";
}
}

页面已正确加载,带有 ControlTemplate,HeaderText 为“测试”。所以看起来 HeaderText 与 ControlTemplate 的绑定(bind)正在工作。但是当我将 HeaderText 设置为“已更改”时,标签不会更新。我调试并检查,一旦我按下按钮,它就会通过 ExecuteButtonChangeValueCommand() 和 SetProperty(ref _headerText, value)

有什么建议吗?

谢谢!

最佳答案

我将 TemplateBinding 更改为:

Text="{TemplateBinding BindingContext.HeaderText}"

到:

Text="{TemplateBinding Parent.BindingContext.HeaderText}"

当我按下您更改的按钮时,它现在会更新。

我认为这是由于模板没有自动设置绑定(bind)上下文,但是模板的父级 (PrismContentPage9) 的 BindingContext 是从 Prism 的 AutowireViewModel 属性自动连接的,例如

prism:ViewModelLocator.AutowireViewModel="True"

让我知道这是否适合您。

关于xamarin - Prism 和控制模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50348765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com