你怎么能以编程方式将Double绑定到WidthProperty?

时间:2013-10-07 14:30:00

标签: c# wpf binding double

doubleint可以绑定到WidthPropertyButton等元素的Border吗?

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

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

更新

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

5 个答案:

答案 0 :(得分:3)

您无法绑定局部变量。

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

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

答案 1 :(得分:0)

您的意图是始终将绑定的源值乘以某个常量吗?

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

否则,你可以写

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

答案 2 :(得分:0)

我的解决方案是使用Slider创建Visibility="Collapsed"来隐藏元素。然后我在想要乘以该值的对象上创建了一个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的宽度和高度。圆的值用于基于矩形的值。

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

答案 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};