XAML 如何UIElement.property从另一个类修改www.example.com?

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

我正在开发一个WinUI应用程序(c#和xaml),它有多个框架和页面。问题是我需要修改另一个类的UIElement属性(TextBox.Text)。我已经尝试了很多方法,但没有一个奏效。如果有人能给我一些有用的方法,我会很高兴。它可以是除了xaml数据绑定(〈property ={" Binding bindingName "})之外的任何东西。
谢谢你的帮助。

utugiqy6

utugiqy61#

在这个示例代码中,我有2个页面(Page1Page2)和1个ViewModel(MainViewModel)。每个页面都有一个TextBox,它们绑定到MainViewModel中的同一个属性。
如果您更改Page1中的文本,则Page2中的文本也将更改,反之亦然。

NuGet软件包

using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.UI.Xaml;

namespace MultiplePagesSingleViewModel;

public partial class App : Application
{
    private Window? window;

    public App()
    {
        this.InitializeComponent();
        Ioc.Default.ConfigureServices(
            new ServiceCollection()
            // This needs to be Singleton
            .AddSingleton<MainViewModel>()
            .BuildServiceProvider());
    }

    protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
    {
        this.window = new MainWindow();
        this.window.Activate();
    }
}

第一页. xaml

<Page
    x:Class="MultiplePagesSingleViewModel.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="using:MultiplePagesSingleViewModel"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    mc:Ignorable="d">

    <StackPanel>
        <TextBlock Text="Page 1" />
        <TextBox Text="{x:Bind ViewModel.SomeText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>

</Page>

第一页. xaml.cs

using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.UI.Xaml.Controls;

namespace MultiplePagesSingleViewModel;

public sealed partial class Page1 : Page
{
    public Page1()
    {
        this.InitializeComponent();
        // This MainViewModel is the same instance that Page2 gets.
        ViewModel = Ioc.Default.GetRequiredService<MainViewModel>();
    }

    public MainViewModel ViewModel { get; }
}

第二页. xaml

<Page
    x:Class="MultiplePagesSingleViewModel.Page2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="using:MultiplePagesSingleViewModel"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
    mc:Ignorable="d">

    <StackPanel>
        <TextBlock Text="Page 2" />
        <TextBox Text="{x:Bind ViewModel.SomeText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>

</Page>

第二页. xaml.cs

using CommunityToolkit.Mvvm.DependencyInjection;
using Microsoft.UI.Xaml.Controls;

namespace MultiplePagesSingleViewModel;

public sealed partial class Page2 : Page
{
    public Page2()
    {
        InitializeComponent();
        // This MainViewModel is the same instance that Page1 gets.
        ViewModel = Ioc.Default.GetRequiredService<MainViewModel>();
    }

    public MainViewModel ViewModel { get; }
}

主视图模型.cs

using CommunityToolkit.Mvvm.ComponentModel;

namespace MultiplePagesSingleViewModel;

// This class needs to be "partial" for CommunityToolkit.Mvvm.
public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    // The CommunityToolkit.Mvvm will automatically generate
    // a UI-Interactive "SomeText" property for you.
    private string someText = "Default text";
}

主窗口.xaml

<Window
    x:Class="MultiplePagesSingleViewModel.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="using:MultiplePagesSingleViewModel"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid ColumnDefinitions="*,*">
        <local:Page1 Grid.Column="0" />
        <local:Page2 Grid.Column="1" />
    </Grid>

</Window>
yhxst69z

yhxst69z2#

好吧,终于经过两个星期的研究,我找到了一个解决办法。
解决方案基本上是从不同的类中引发和捕获事件。
我已经创建了CustomEventArgs类,然后publisher类就是我的控制器(.cs),我的订阅者是模型(.xaml.cs).我遇到的唯一问题是将所有方法和属性设置为静态以便能够从其他模型调用控制器函数.问题是在publisher类中的raiseEvent(this, e);上,this不能是静态的,所以我写了null
此外,我想说的是,它的工作非常流畅,没有滞后或延迟,即使我经常使用它。
我希望这对遇到同样问题的每个人都有帮助。

相关问题