我创建了一个用户控件和一个关联的视图模型。视图模型的属性“DisplayName”和“TimeIntervalLength”显示在用户控件视图 DataBinding 中。根据视图模型的这些属性,我想更新控件的宽度。宽度应为“TimeIntervalLength”,但至少应为“DisplayName”。我试图覆盖“OnPropertyChanged”,但这不起作用。此外,我找不到要覆盖的适当事件。
提前致谢。
我创建了一个用户控件和一个关联的视图模型。视图模型的属性“DisplayName”和“TimeIntervalLength”显示在用户控件视图 DataBinding 中。根据视图模型的这些属性,我想更新控件的宽度。宽度应为“TimeIntervalLength”,但至少应为“DisplayName”。我试图覆盖“OnPropertyChanged”,但这不起作用。此外,我找不到要覆盖的适当事件。
提前致谢。
您可以尝试在您的用户控件上不指定宽度/高度。它应该适合托管在其中的控件。
<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);
}
不完全确定我是否理解正确,但听起来最简单的方法是将计算属性添加到您的 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>
而不是控制宽度,控制MinWidth。并在UserControl的构造函数中清除Width属性:
this.ClearValue(WidthProperty);