double
或int
可以绑定到WidthProperty
或Button
等元素的Border
吗?
我有类似的东西,但它似乎不起作用。也许它不是绑定所需的Value
属性。
double changedNum = 3;
double myWidth = 100 * changedNum;
border1.SetBinding(WidthProperty, new Binding("Value") { Source = myWidth });
更新
我已经回答了我的问题。我的目标是绑定现有的滑块值并乘以或除以double。然后将该值设置为另一个对象的WidthProperty的绑定。解决方案如下。
答案 0 :(得分:3)
您无法绑定局部变量。
相反,您需要绑定某个对象的属性:
someObject.SomeProperty = 42;
new Binding("SomeProperty", someObject)
答案 1 :(得分:0)
您的意图是始终将绑定的源值乘以某个常量吗?
IValueConverter
或WidthProperty
更新时使用乘积值更新模板部件的相应属性。否则,你可以写
double changedNum = 3;
double myWidth = 100 * changedNum;
border1.SetBinding(WidthProperty, new Binding(".") { Source = myWidth });
答案 2 :(得分:0)
我的解决方案是使用Slider
创建Visibility="Collapsed"
来隐藏元素。然后我在想要乘以该值的对象上创建了一个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
的宽度和高度。圆的值用于基于矩形的值。
在这种情况下,矩形的宽度是圆的宽度的两倍和高度的一半。我不知道使用隐藏元素是否是最佳解决方案,但它是一种选择。
答案 3 :(得分:0)
为了使数据绑定工作,绑定目标,即绑定值的Property需要是Dependency属性,绑定源需要是类Property。
在下面的代码段中
<Textbox Text="{Binding MyText}" ... />
控件Textbox有一个名为“TextProperty”的依赖项属性,MyText必须是一个类Property。 MyText需要成为类属性的原因是因为幕后WPF / Silverlight在更新值时读取要绑定的值和getMyText()
时查找方法setMyText()
。有关绑定如何在幕后工作的更多信息,我建议您使用dotPeek或其他工具查看PresenationFramework.dll中Binding类的实现。
答案 4 :(得分:0)
就像SLacks的答案一样,但是有匿名类型:
Binding binding = new Binding("SomeProperty");
binding.Source = new {SomeProperty = myLocalVariable};