2

ユーザー コントロールと関連するビュー モデルを作成しました。ビュー モデルのプロパティ「DisplayName」と「TimeIntervalLength」は、ユーザー コントロール ビュー DataBinding に表示されます。ビュー モデルのこれらのプロパティに応じて、コントロールの幅を更新したいと考えています。幅は「TimeIntervalLength」にする必要がありますが、少なくとも「DisplayName」にする必要があります。「OnPropertyChanged」をオーバーライドしようとしましたが、これは機能しません。さらに、オーバーライドする適切なイベントが見つかりませんでした。

前もって感謝します。

4

3 に答える 3

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>

もう1つのオプションは、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に追加し、ビューからそれにバインドすることです。

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

Width を制御する代わりに、MinWidthを制御します。そして、UserControl のコンストラクターで Width プロパティをクリアします。

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