2

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

提前致谢。

4

3 回答 3

1

您可以尝试在您的用户控件上不指定宽度/高度。它应该适合托管在其中的控件。

<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);
}
于 2009-07-20T15:41:48.783 回答
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>
于 2009-07-20T15:26:32.510 回答
0

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

this.ClearValue(WidthProperty);
于 2009-07-21T00:36:29.867 回答