使用DataBinding值更新控件的宽度(WPF)

时间:2009-07-20 14:51:49

标签: wpf data-binding width

我创建了一个用户控件和一个关联的视图模型。视图模型的属性“DisplayName”和“TimeIntervalLength”显示在用户控件视图DataBinding中。根据视图模型的那些属性,我想更新控件的宽度。 宽度应为“TimeIntervalLength”,但至少为“DisplayName”。我试图覆盖“OnPropertyChanged”,但这不起作用。此外,我找不到适当的事件来覆盖。

提前致谢。

3 个答案:

答案 0 :(得分:1)

您可以尝试不在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);
}

答案 1 :(得分:0)

我不完全确定我是否理解正确,但听起来最简单的事情是将计算属性添加到ViewModel然后从View中绑定到:

// 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>

答案 2 :(得分:0)

不是控制宽度,而是控制 MinWidth 。并清除UserControl的构造函数中的Width属性:

this.ClearValue(WidthProperty);