Использование значений DataBinding для обновления ширины элемента управления (WPF) - PullRequest
2 голосов
/ 20 июля 2009

Я создал пользовательский элемент управления и связанную модель представления. Свойства "DisplayName" и "TimeIntervalLength" модели представления отображаются в представлении пользовательского элемента управления DataBinding. В зависимости от этих свойств модели представления я хочу обновить ширину моего элемента управления. Ширина должна быть "TimeIntervalLength", но по крайней мере "DisplayName". Я пытался переопределить «OnPropertyChanged», но это не работает. Кроме того, я не смог найти соответствующее событие для переопределения.

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 20 июля 2009

Вы можете попробовать просто не указывать ширину / высоту в вашем UserControl. Он должен соответствовать элементам управления, размещенным в.

<UserControl x:Class="MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <TextBlock x:Name="TextBlock1" Text="DisplayName Goes Here" />
        <local:TimeIntervalControl x:Name="TimeInterval" />
    </StackPanel>
</UserControl>

Другой вариант - использовать IValueConverter для более тяжелого подъема:

<UserControl x:Class="MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <UserControl.Resources>
        <local:MaxValueConverter x:Key="MaxValue" />
    </UserControl.Resources>
    <UserControl.Width>
        <MultiBinding Converter="{StaticResource MaxValue}">
            <Binding Path="ActualWidth" ElementName="TextBlock1" />
            <Binding Path="ActualWidth" ElementName="TimeInterval" />
        </MultiBinding>
    </UserControl.Width>
    <StackPanel>
        <TextBlock x:Name="TextBlock1" Text="DisplayName Goes Here" />
        <local:TimeIntervalControl x:Name="TimeInterval" />
    </StackPanel>
</UserControl>

Поднятие тяжестей в вашем MaxValueConverter:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
   if (values == null)
   {
       return Binding.DoNothing;
   }

   return values.Max(obj => (obj is double) ? (double)obj : 0.0);
}
0 голосов
/ 21 июля 2009

Вместо управления шириной, управляйте MinWidth . И очистите свойство Width в конструкторе UserControl:

this.ClearValue(WidthProperty);
0 голосов
/ 20 июля 2009

Не совсем уверен, правильно ли я понимаю, но звучит так, что проще всего было бы добавить вычисляемое свойство в вашу ViewModel, а затем привязать к нему из представления:

// In your model
public int DisplayWidth {
    get { return CalculateDisplayWidth(); } // todo
}

(Очевидно, вы можете заменить «CalculateDisplayWidth ()» на все, что вам нужно)

<!-- In your view -->
<UserControl x:Class="MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="{Binding Path=DisplayWidth, Mode=OneWay}">

</UserControl>
...