Привязка пользовательского свойства зависимости к ширине элемента управления - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть пользовательский элемент управления, который содержит следующий элемент:

        <Border x:Name="border" BorderThickness="1">
            <StackPanel Orientation="Horizontal">
                <CheckBox Margin="5"></CheckBox>
                <TextBox Width="100" Margin="5"/>
            </StackPanel>
        </Border>

В коде этого пользовательского элемента управления у меня есть свойство пользовательской зависимости:

        public static readonly DependencyProperty BorderWidthProperty = DependencyProperty.Register("BorderWidth", typeof(int), typeof(TestControl));
        public int BorderWidth
        {
            get { return (int)base.GetValue(BorderWidthProperty); }
            set { base.SetValue(BorderWidthProperty, value); }
        }

Что яПопытка сделать так, чтобы свойство BorderWidth всегда было равно ширине элемента управления границей.

Я попытался добавить следующую привязку, думая, что OneWayToSource был тем, что мне нужно, где myControl - это имя пользовательского элементаborder содержится в:

<UserControl x:Class="Sandbox.TestControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             x:Name="myControl">

<Border x:Name="border" Width="{Binding ElementName=myControl, Path=BorderWidth, Mode=OneWayToSource}">

Но я получаю следующее исключение:

System.Windows.Data Error: 7 : ConvertBack cannot convert value 'NaN' (type 'Double'). BindingExpression:Path=BorderWidth; DataItem='TestControl' (Name='myControl'); target element is 'Border' (Name='border'); target property is 'Width' (type 'Double') OverflowException:'System.OverflowException: Value was either too large or too small for an Int32.
   at System.Convert.ToInt32(Double value)
   at System.Double.System.IConvertible.ToInt32(IFormatProvider provider)
   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
   at MS.Internal.Data.SystemConvertConverter.ConvertBack(Object o, Type type, Object parameter, CultureInfo culture)
   at System.Windows.Data.BindingExpression.ConvertBackHelper(IValueConverter converter, Object value, Type sourceType, Object parameter, CultureInfo culture)'

Я пытаюсь сделать так, чтобы ширина границы контролировалась как обычно макетомсистема, но всегда имеет свойство BorderWidth, равное границам Width.Похоже, что ширина элемента границы не определяется при попытке обновить BorderWidth.

Кроме того, требуется ли свойство BorderWidth как свойство зависимости, чтобы это работало?

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 ноября 2010

Я закончил тем, что изменил свой подход.Я добавил свойство в свой пользовательский элемент управления, которое обновлялось при изменении размера границы (прослушивание события SizeChanged границы).Пользовательский элемент управления реализует INotifyPropertyChanged, и любой, кто интересуется BorderWidth, теперь всегда будет возвращать ActualWidth элемента border:

        double _borderWidth;
        public double BorderWidth
        {
            get
            {
                return _borderWidth;
            }
            set
            {
                _borderWidth= value;
                this.OnPropertyChanged("BorderWidth");
            }
        }

        private void Border_SizeChanged(object sender, System.Windows.SizeChangedEventArgs e)
        {
            BorderWidth = border.ActualWidth;
        }
0 голосов
/ 11 ноября 2010

Вам лучше использовать FrameworkElement.ActualWidth свойство.

РЕДАКТИРОВАТЬ: См. Комментарий ниже.этот подход не работает.

...