如何以编程方式将双精度绑定到宽度属性
本文关键字:绑定 属性 双精度 编程 方式 | 更新日期: 2023-09-27 18:34:10
double
或int
可以绑定到元素(如Button
或Border
)的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
与乘法双精度绑定到所需的对象,例如 Border
或 Button
.
这是一个工作示例。
<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
控制圆的Width
和Height
。有两个隐藏的滑块可以控制 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};