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
{
}