0

a doubleorint可以绑定到 a orWidthProperty等​​元素的 a吗?ButtonBorder

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

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

更新

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

4

5 回答 5

3

您不能绑定局部变量。

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

someObject.SomeProperty = 42;
new Binding("SomeProperty", someObject)
于 2013-10-07T14:31:41.967 回答
0

要使数据绑定起作用,绑定目标(即绑定值的属性)需要是依赖属性,绑定源需要是类属性。

在下面的代码片段中

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

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

于 2013-10-08T02:10:53.293 回答
0

您是否打算始终将绑定源值乘以某个常数?

  • 然后你可能想IValueConverter在你的绑定中使用一个或者
  • 如果您正在编写控制代码,请将您的边框元素定义为模板部分,并在每次WidthProperty更新时使用相乘的值更新模板部分的相应属性。

否则,你可以写

double changedNum = 3;
double myWidth = 100 * changedNum;
border1.SetBinding(WidthProperty, new Binding(".") { Source = myWidth });
于 2013-10-07T14:54:52.230 回答
0

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

这将允许我将Value乘以双精度的 绑定到所需的对象,例如Borderor 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;
            }
        }
    }
}

在这里, TheSlider控制圆的WidthHeight。有两个隐藏的滑块可以控制Rectangle. 圆的值用于作为矩形值的基础。

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

于 2013-10-07T18:55:32.703 回答
0

就像 Slack 的回答一样,但使用匿名类型:

Binding binding = new Binding("SomeProperty");
binding.Source = new {SomeProperty = myLocalVariable};
于 2014-07-30T12:52:26.113 回答