MVVM开发的优势就是绑定,所以大家要好好运用绑定。我已经帮大家写好了AvaloniaObject的扩展用于解除和判断绑定。

https://www.cnblogs.com/dalgleish/p/19022485

ElementToElementBinding.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"
        Height="300" Width="300"
        x:Class="AvaloniaUI.ElementToElementBinding"
        Title="ElementToElementBinding">
    <StackPanel Margin="5">
        <Slider Name="sliderFontSize" Margin="3" Minimum="1" Maximum="40" Value="10" TickFrequency="1"
                IsSnapToTickEnabled="True" TickPlacement="TopLeft"></Slider>
        
        <TextBlock Margin="10" Name="lblSampleText"
           FontSize="{Binding #sliderFontSize.Value}"
           Text="Simple Text">
        </TextBlock>

        <StackPanel Orientation="Horizontal" >
            <Button Margin="5" Padding="3" Click="cmd_SetSmall">Set to Small</Button>
            <Button Margin="5" Padding="3" Click="cmd_SetNormal">Set to Normal</Button>
            <Button Margin="5" Padding="3" Click="cmd_SetLarge">Set to Large</Button>
        </StackPanel>

        <Button Margin="5" Padding="3" HorizontalAlignment="Left" Click="cmd_BoundObject">Set Bound Object (Dynamically)</Button>
    </StackPanel>
</Window>

ElementToElementBinding.axaml.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using Shares.Avalonia;
using System;
using System.Reactive.Linq;

namespace AvaloniaUI;

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

    private void cmd_SetSmall(object? sender, RoutedEventArgs e)
    {
        sliderFontSize.Value = 2;
    }
    private void cmd_SetNormal(object? sender, RoutedEventArgs e)
    {
        sliderFontSize.Value = this.FontSize;
    }
    private void cmd_SetLarge(object? sender, RoutedEventArgs e)
    {
        //xaml中默认是OneWay,Slider -> lblSampleText
        lblSampleText.FontSize = 30;
    }

    private void cmd_BoundObject(object? sender, RoutedEventArgs e)
    {
        //lblSampleText -> Slider,单向。从而补全双向

        if (!sliderFontSize.IsBinding(Slider.ValueProperty))
            sliderFontSize[!Slider.ValueProperty] = lblSampleText[!TextBlock.FontSizeProperty];
        else
            sliderFontSize.RemoveBinding(Slider.ValueProperty);
    }
}

运行效果

image

 

posted on 2025-08-05 07:24  dalgleish  阅读(7)  评论(0)    收藏  举报