Avalonia11 專案 一個Window 包兩個View 共用同一個ViewModels 使用 CommunityToolkit.Mvvm.Messaging 實作一個事件函數驅動 兩個View顯示變化

Avalonia11 專案 一個Window 包兩個View 共用同一個ViewModels 使用 CommunityToolkit.Mvvm.Messaging 實作一個事件函數驅動 兩個View顯示變化

Avalonia11 專案 一個Window 包兩個View 共用同一個ViewModels 使用 CommunityToolkit.Mvvm.Messaging 實作一個事件函數驅動 兩個View顯示變化


資料來源: chatgpt(AI)


GITHUB: https://github.com/jash-git/AvaloniaUI_CS_test

    測試範例:
        Avalonia11_CommunityToolkit_Mvvm_Test


MainWindow.axaml

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:vm="using:Avalonia11_CommunityToolkit_Mvvm_Test.ViewModels"
        xmlns:views="clr-namespace:Avalonia11_CommunityToolkit_Mvvm_Test.Views"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        x:Class="Avalonia11_CommunityToolkit_Mvvm_Test.Views.MainWindow"
        Icon="/Assets/avalonia-logo.ico"
        Title="Avalonia11_CommunityToolkit_Mvvm_Test"
        x:DataType="vm:MainWindowViewModels">
    <Grid ColumnDefinitions="1*,1*">
        <!-- 左側 UserControl -->
        <views:LeftView />

        <!-- 右側 UserControl -->
        <views:RightView Grid.Column="1" />
    </Grid>
</Window>


MainWindow.axaml.cs

using Avalonia.Controls;

namespace Avalonia11_CommunityToolkit_Mvvm_Test.Views;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}


LeftView.axaml

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:vm="using:Avalonia11_CommunityToolkit_Mvvm_Test.ViewModels"
             xmlns:views="clr-namespace:Avalonia11_CommunityToolkit_Mvvm_Test.Views"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="Avalonia11_CommunityToolkit_Mvvm_Test.Views.LeftView"
             x:DataType="vm:MainWindowViewModels">
    <StackPanel Margin="10">
        <TextBlock Text="左側View" FontSize="20" />
        <TextBlock x:Name="LeftShow" Text="" />
        <Button Content="左側 按鈕" Click="Button_Click"/>
    </StackPanel>
</UserControl>


LeftView.axaml.cs

using Avalonia.Controls;
using Avalonia11_CommunityToolkit_Mvvm_Test.ViewModels;
using CommunityToolkit.Mvvm.Messaging;   // ← 必須加這一行!

namespace Avalonia11_CommunityToolkit_Mvvm_Test.Views;

public partial class LeftView : UserControl
{
    public LeftView()
    {
        InitializeComponent();
    }

    private void Button_Click(object? sender, Avalonia.Interactivity.RoutedEventArgs e)
    {
        int Count = (((MainWindowViewModels)(Parent.DataContext)).IntCounter++);
        LeftShow.Text = $"Left Button Clicked : {Count}";
        WeakReferenceMessenger.Default.Send(new UpdateTextMessage("Fun_Code00"));//發送訊息
    }
}


RightView.axaml

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:vm="using:Avalonia11_CommunityToolkit_Mvvm_Test.ViewModels"
             xmlns:views="clr-namespace:Avalonia11_CommunityToolkit_Mvvm_Test.Views"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="Avalonia11_CommunityToolkit_Mvvm_Test.Views.RightView"
             x:DataType="vm:MainWindowViewModels">
    <StackPanel Margin="10">
        <TextBlock Text="右側 View" FontSize="20" />
        <TextBlock x:Name="RightShow" Text="" />
    </StackPanel>
</UserControl>


RightView.axaml.cs

using Avalonia.Controls;
using Avalonia11_CommunityToolkit_Mvvm_Test.ViewModels;
using CommunityToolkit.Mvvm.Messaging;

namespace Avalonia11_CommunityToolkit_Mvvm_Test.Views;

public partial class RightView : UserControl
{
    public void ListenEvent()
    {
        WeakReferenceMessenger.Default.Register<UpdateTextMessage>(this, (r, msg) =>
        {
            int Count = ((MainWindowViewModels)(Parent.DataContext)).IntCounter;
            // 加工訊息
            switch (msg.Value)
            {
                case "Fun_Code00":
                    RightShow.Text= $"接收左側按鈕按下次數:{Count}";
                    break;
                default:
                    msg = new UpdateTextMessage("Right View Received Unknown Code");
                    break;

            }
        });
    }
    public RightView()
    {
        InitializeComponent();
        ListenEvent();
    }
}


MainWindowViewModels.cs

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging.Messages;

namespace Avalonia11_CommunityToolkit_Mvvm_Test.ViewModels;

//---
//建立訊息類型(Message class)
public class UpdateTextMessage : ValueChangedMessage<string>
{
    public UpdateTextMessage(string value) : base(value) { }
}
//---建立訊息類型(Message class)

public class MainWindowViewModels : ViewModelBase
{
    private int m_intCounter;
    public int IntCounter
    {
        get => m_intCounter;
        set => SetProperty(ref m_intCounter, value);
    }

    public IRelayCommand SendCommand { get; }

    public MainWindowViewModels()
    {
    }
}


ViewModelBase.cs

using CommunityToolkit.Mvvm.ComponentModel;

namespace Avalonia11_CommunityToolkit_Mvvm_Test.ViewModels;

public class ViewModelBase : ObservableObject
{
}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *