使用IValueConverter将列的宽度绑定到DependencyProperty

时间:2012-01-30 13:07:30

标签: wpf binding width ivalueconverter

我正在尝试在Grid元素变量中创建列的宽度。为此,我有一个DependencyProperty“ItemWidth”并将Button中的Width元素绑定到此DP。由于TwoWay-Binding,我需要一个将双精度转换为DataGridLength的转换器。

我的MainWindow.xaml看起来像这样:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:utils="clr-namespace:WpfApplication1" Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.Resources>
        <utils:ColumnWidthConverter x:Key="columnWidthConverter"/>
    </Grid.Resources>
    <Button Grid.Row="0" Grid.Column="0" Width="{Binding Path=ItemWidth, Mode=TwoWay, Converter={StaticResource columnWidthConverter}}" Click="Shorter_Click">shorter</Button>
    <Button Grid.Row="0" Grid.Column="1" Width="{Binding Path=ItemWidth, Mode=TwoWay, Converter={StaticResource columnWidthConverter}}" Click="Longer_Click">longer</Button>
</Grid>
</Window>

ColumnWidthConverter.cs如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows;

namespace WpfApplication1
{
    class ColumnWidthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return null;
            else
            {
                DataGridLengthConverter cv = new DataGridLengthConverter();
                object result = cv.ConvertFrom(value);
                return result;
            }

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == null)
                return null;
            else
            {
                DataGridLengthConverter cv = new DataGridLengthConverter();
                return cv.ConvertTo(value, typeof(double));
            }
        }
    }
}

MainWindow.xaml.cs看起来像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public double ItemWidth
        {
            get { return (double)GetValue(ItemWidthProperty); }
            set { SetValue(ItemWidthProperty, value); }
        }

        public static readonly DependencyProperty ItemWidthProperty =
        DependencyProperty.Register("ItemWidth", typeof(double), typeof(MainWindow), new UIPropertyMetadata(0.0));

        private void Shorter_Click(object sender, RoutedEventArgs e)
        {
            this.ItemWidth -= 100;
        }

        private void Longer_Click(object sender, RoutedEventArgs e)
        {
            this.ItemWidth += 100;
        }
    }
}

因此,当我单击其中一个按钮时,按钮的宽度应该会改变。但这不会发生。你能告诉我为什么会这样和某种解决方案吗?

2 个答案:

答案 0 :(得分:1)

你在绑定中没有设置任何来源,因此它相对于DataContext,你似乎没有在任何地方设置,如果你添加它应该工作。 e.g。

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ...

如果您不熟悉它,您可能希望(即肯定应该)查看debugging data bindings

你还绑定了不需要转换器的属性,实际上转换器可能会在这里引起问题,你不是要绑定ColumnDefinition.Width吗?

答案 1 :(得分:1)

我将以下内容用于我的GridSplitter

public class DoubleToGridLengthConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {

        double i = (double)value;

        GridLength result = new GridLength(i);

        return result;

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {

        GridLength g = (GridLength)value;

        return (double)g.Value;

    }

}

XAML

Width="{Binding Source={x:Static Properties:Settings.Default}, Path=GridSplitter, Mode=TwoWay, Converter={StaticResource GridLengthConverter}}"