我创建了一个用户控件和一个关联的视图模型。视图模型的属性“DisplayName”和“TimeIntervalLength”显示在用户控件视图DataBinding中。根据视图模型的那些属性,我想更新控件的宽度。 宽度应为“TimeIntervalLength”,但至少为“DisplayName”。我试图覆盖“OnPropertyChanged”,但这不起作用。此外,我找不到适当的事件来覆盖。
提前致谢。
答案 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);