2009-07-20 14 views
2

ユーザーコントロールと関連するビューモデルを作成しました。ビューモデルのプロパティ "DisplayName"と "TimeIntervalLength"は、ユーザーコントロールビューのDataBindingに表示されます。ビューモデルのプロパティに応じて、コントロールの幅を更新したいと思います。 幅は "TimeIntervalLength"で、少なくとも "DisplayName"である必要があります。私は "OnPropertyChanged"をオーバーライドしようとしましたが、これはうまくいきません。さらに、私は上書きする適切なイベントを見つけることができませんでした。DataBinding値を使用してコントロールの幅(WPF)を更新する

ありがとうございます。

+0

バインディングの宣言方法を投稿できる場合は、根本的な原因を特定するのに役立ちます。それはさまざまな異なる問題である可能性があります。ありがとう! –

答えて

1

あなたは自分のUserControl上の幅/高さを指定しないしようとします。それは、内部でホストされているコントロールに適合しなければなりません。あなたのMaxValueConverterに

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

力仕事:

<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を使用することです

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

メタコメント:ActualWidthは、変更されたことを常に示すわけではありません。バインドを再評価するロジックを追加する必要があります。 – user7116

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

代わりの幅、制御のminWidthを制御します。 UserControlのコンストラクタのWidthプロパティをクリアします。

this.ClearValue(WidthProperty); 
関連する問題