2009-08-21 15 views
1

すでに投稿されたvery similar questionがあります。実際、そのポストの答えの結果はまさに私の後のものですが、そのコードを配置するコードビハインドはありません。すべてのロジックはViewModelにカプセル化されています。 ViewModelは特定のビジュアル要素を直接参照することは想定されていないため、このコードもそこに存在することはできません。どういうわけか、XAMLでこれと同じことを実行する方法はありますか、私は最終的にコードビハインドファイルを強制的に作成する理由に遭遇しましたか?あなたが添付properties..itで何かを試みることができるXAMLのバインドされたコントロールの検証を強制しますか?

答えて

1

は少し凝ったのですが、それは他の回答と同じことなので、私はそれが動作するはずだと思う:

public class DependencyPropertyCollection : List<DependencyProperty> 
{ } 

public static class ValidationUtil 
{ 
    public static readonly DependencyProperty ForceValidationProperty = 
     DependencyProperty.RegisterAttached("ForceValidation", typeof(DependencyPropertyCollection), typeof(ValidationUtil), new PropertyMetadata(OnForceValidationChanged)); 
    private static void OnForceValidationChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     FrameworkElement element = (FrameworkElement)sender; 
     element.Loaded += OnElementLoaded; 
    } 

    private static void OnElementLoaded(object sender, RoutedEventArgs e) 
    { 
     FrameworkElement element = (FrameworkElement)sender; 
     element.Loaded -= OnElementLoaded; 
     foreach (DependencyProperty property in GetForceValidation(element)) 
      element.GetBindingExpression(property).UpdateSource(); 
    } 

    public static DependencyPropertyCollection GetForceValidation(DependencyObject obj) 
    { 
     return (DependencyPropertyCollection)obj.GetValue(ForceValidationProperty); 
    } 
    public static void SetForceValidation(DependencyObject obj, DependencyPropertyCollection value) 
    { 
     obj.SetValue(ForceValidationProperty, value); 
    } 
} 

そして、あなたはこのようにそれを使用します。

<TextBlock Text="{Binding Text}"> 
    <local:ValidationUtil.ForceValidation> 
     <local:DependencyPropertyCollection> 
      <x:StaticExtension Member="TextBlock.TextProperty"/> 
     </local:DependencyPropertyCollection> 
    </local:ValidationUtil.ForceValidation> 
</TextBlock> 

コレクション内で、検証するバインディングを持つ各DependencyPropertyを指定します。

関連する問題