如何以编程方式将双精度绑定到宽度属性

本文关键字:绑定 属性 双精度 编程 方式 | 更新日期: 2023-09-27 18:34:10

doubleint可以绑定到元素(如ButtonBorder)的WidthProperty吗?

我有这样的东西,但它似乎不起作用。也许这不是绑定所需的Value属性。

double changedNum = 3;
double myWidth = 100 * changedNum;
border1.SetBinding(WidthProperty, new Binding("Value") { Source = myWidth });

更新

我已经发布了我问题的答案。我的目标是绑定现有的滑块值并乘以或除以双精度。然后将该值设置为另一个对象的 WidthProperty 的绑定。解决方案如下。

如何以编程方式将双精度绑定到宽度属性

不能绑定局部变量。

相反,您需要绑定某个对象的属性:

someObject.SomeProperty = 42;
new Binding("SomeProperty", someObject)

您的意图是否总是将绑定的源值乘以某个常量?

  • 然后,您可能希望在绑定中使用IValueConverter
  • 如果要编写控件代码,请将边框元素定义为模板部件,并在每次更新WidthProperty时用乘值更新模板部件的相应属性。

否则,你可以写

double changedNum = 3;
double myWidth = 100 * changedNum;
border1.SetBinding(WidthProperty, new Binding(".") { Source = myWidth });

我的解决方案是创建一个带有Visibility="Collapsed"来隐藏元素的Slider。然后,我在要为其乘以值的对象上创建了一个ValueChanged事件。该事件将更新隐藏的Slider Value

这将允许我将Value与乘法双精度绑定到所需的对象,例如 BorderButton .

这是一个工作示例。

<Window x:Class="WidthExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" SizeToContent="WidthAndHeight">
    <Grid Margin="10" MinWidth="500" HorizontalAlignment="Center">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Ellipse Fill="#FFCD4B7A" HorizontalAlignment="Center" Grid.Row="0" VerticalAlignment="Top" Width="{Binding ElementName=mainSlider, Path=Value}" Height="{Binding ElementName=mainSlider, Path=Value}" Margin="0,0,0,10"/>
        <Rectangle Fill="#FFCD6B19" HorizontalAlignment="Center" Grid.Row="1" VerticalAlignment="Top" Width="{Binding ElementName=hiddenWidthSlider, Path=Value}" Height="{Binding ElementName=hiddenHeightSlider, Path=Value}" Margin="0,0,0,10"/>
        <StackPanel Grid.Row="2">
            <Slider x:Name="mainSlider" Value="50" Minimum="10" Maximum="300" SmallChange="1" LargeChange="1" TickPlacement="BottomRight" TickFrequency="5" ValueChanged="mainSlider_ValueChanged" />
            <Slider x:Name="hiddenWidthSlider" Value="50" Minimum="1" Maximum="1000" SmallChange="1" LargeChange="1" Visibility="Collapsed" />
            <Slider x:Name="hiddenHeightSlider" Value="50" Minimum="1" Maximum="1000" SmallChange="1" LargeChange="1" Visibility="Collapsed" />
        </StackPanel>
    </Grid>
</Window>

.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WidthExample
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void mainSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            if (hiddenWidthSlider != null)
            {
                hiddenWidthSlider.Value = mainSlider.Value * 2;
            }
            if (hiddenHeightSlider != null)
            {
                hiddenHeightSlider.Value = mainSlider.Value / 2;
            }
        }
    }
}

在这里,Slider控制圆的WidthHeight。有两个隐藏的滑块可以控制 Rectangle的宽度和高度 .圆的值用于矩形的值的基础。

在这种情况下,矩形的宽度是宽度的两倍和圆的高度的一半。我不知道使用隐藏元素是否是最好的解决方案,但这是一种选择。

要使数据绑定正常工作,绑定目标(即值绑定到的属性)必须是依赖项属性,绑定源必须是类属性。

在下面的代码片段中

<Textbox Text="{Binding MyText}" ... />

控件文本框具有一个名为"TextProperty"的依赖项属性,MyText 必须是类属性。MyText 需要成为类属性的原因是,在后台,WPF/Silverlight 在读取要绑定的值时查找方法getMyText(),并在更新值时setMyText()。有关绑定如何在幕后工作的更多信息,我建议使用 dotPeek 或其他工具查看 PresenationFramework 中 Binding 类的实现.dll。

就像

SLacks回答但使用匿名类型一样:

Binding binding = new Binding("SomeProperty");
binding.Source = new {SomeProperty = myLocalVariable};