XAML (winui3 with c#)更改绑定的Xmal UI元素的源数据,无法在此UI元素上显示

eulz3vhy  于 2022-12-28  发布在  C#
关注(0)|答案(1)|浏览(244)

我的问题是:xaml元素(InfoBar)从后端绑定源数据,用元素属性改变InfoBar的消息,源数据(绑定InfoBar的消息)改变;
但是,当我更改源数据(我绑定的)时,信息栏没有显示我更改的消息。
源代码:https://github.com/npbcts/ShowMessageT.git
源代码(其他部分):https://github.com/npbcts/ShowMessageT.Core.git
//======================我的想法===================
我想创建一个信息栏,你可以在这个WinUI3应用程序的任何地方显示这个信息栏上的信息。
例如:在ShellPage上创建的InfoBar,可以在MainPage的Page中使用方法显示信息。
框架:.net6.0,IDE:可视化工作室2022
一个WinUI3桌面使用MVVM,创建与"模板工作室的WinUI"模板。
本模板主要技术有:

  • 使用微软.扩展.依赖注入;
  • 使用社区工具包、Mvvm、组件模型;

正如你所知道的服务. AddSingleton方法,你可以得到一个对象,属性的消息绑定对象的数据,然后你改变这个应用程序的任何地方的对象的数据,信息栏的消息将改变,并显示新的(理论上)。
//===========创建元素(信息栏)和绑定数据的过程========
shellPage.xaml:

<InfoBar Grid.Row="3" x:Name="ShellTipInfo" Margin="36,5,36,0" x:FieldModifier="Public" 
    IsOpen="{x:Bind ViewModel.TheTipInfoMessage.IsOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"     
    Message="{x:Bind ViewModel.TheTipInfoMessage.Message, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"     
    Severity="Informational"     
    Title="Title"     
    CloseButtonClick="ShellTipInfo_CloseButtonClick" />

ShellViewModel.cs

public class ShellViewModel : ObservableRecipient
{

    public ITipInfoServices TheTipInfoMessage;
    public ShellViewModel(ITipInfoServices _tipInfoMessage )
    {
       TheTipInfoMessage = _tipInfoMessage;
    }

}

//============对象的生成服务,依赖注入==================
一个二个一个一个
在App. xaml. cs中注册服务(依赖注入)

services.AddSingleton<ITipInfoServices, TipInfoServices>();

//=================更改源数据并在信息栏上观察更改================ =/在主页上创建服务对象,更改提示信息消息。消息:
MainPage.xaml.cs

var tipInfoMessage = App.GetService<ITipInfoServices>(); 
tipInfoMessage.IsOpen = true; 
tipInfoMessage.Message = "a message......";

结果是,你看不到信息栏上的消息。为什么?我困惑了很长时间...
我看了微软的文档,没有找到答案。有人能帮我吗?非常感谢!

hs1ihplo

hs1ihplo1#

AFAIK,你不能绑定到一个接口,在这个例子中是ITipInfoServices
其中一个变化应该会起作用:

  • 使用TipInfoServices代替ITipInfoServices

  • 在xaml中使用强制转换:
IsOpen="{x:Bind ((local:TipInfoServices)ViewModel.TheTipInfoMessage).IsOpen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"     
Message="{x:Bind ((local:TipInfoServices)ViewModel.TheTipInfoMessage).Message, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

相关问题