【问题标题】:Using DataBinding values to update Width of a Control (WPF)使用 DataBinding 值更新控件的宽度 (WPF)
【发布时间】:2010-11-12 08:21:08
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 如果您可以发布声明绑定的方式,这将有助于确定根本原因。这可能是各种不同的问题。谢谢!

标签: wpf data-binding width


【解决方案1】:

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

this.ClearValue(WidthProperty);

【讨论】:

    【解决方案2】:

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

    <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);
    }
    

    【讨论】:

    • 元注释:ActualWidth 并不总是显示已更改,尤其是在您应用 LayoutTransform 时。您可能需要添加额外的逻辑来重新评估绑定。
    【解决方案3】:

    不完全确定我是否理解正确,但听起来最简单的方法是将计算属性添加到您的 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>
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 2018-03-06
      • 2023-01-03
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多