2016-11-02 14 views
1

ContentControlControlTemplateを作成していて、色付きの背景で囲まれたTextBoxが表示されています。背景を表示するかどうかを定義するプロパティを保持するために、添付プロパティを作成しました。テンプレートの要素のVisibilityプロパティへの添付プロパティにバインドする正しい構文を取得できないようです。ControlTemplateからDependencyPropertyへのバインド

public static class AttachedPropertyExtensions 
{ 
    public static readonly DependencyProperty 
     BackgroundVisible = DependencyProperty.RegisterAttached(
      "BackgroundVisible", 
      typeof(Visibility), 
      typeof(AttachedPropertyExtensions), 
      new PropertyMetadata(default(Visibility))); 

    public static void SetBackgroundVisible(UIElement element, Visibility value) 
    { 
     element.SetValue(BackgroundVisible, value); 
    } 

    public static Visibility GetBackgroundVisible(UIElement element) 
    { 
     return (Visibility)element.GetValue(BackgroundVisible); 
    } 
} 

ControlTemplate

添付プロパティがある

<ControlTemplate x:Key="BorderedTextBlock" TargetType="ContentControl"> 
    <Grid Margin="{StaticResource TextControlMarginThemeThickness}" 
      BorderBrush="{StaticResource TextBoxBorderThemeBrush}" 
      BorderThickness="{StaticResource TextControlBorderThemeThickness}"> 
     <Border x:Name="backgroundBorder" 
       Background="{TemplateBinding Background}" 
       Visibility="{Binding Path=con:AttachedPropertiesExtensions.BackgroundVisible, RelativeSource={RelativeSource Mode=TemplatedParent}}" /> 

     <ScrollViewer HorizontalScrollMode="Disabled" 
         VerticalScrollMode="Enabled" 
         VerticalScrollBarVisibility="Visible"> 
      <ContentPresenter Height="80" 
           TextWrapping="Wrap" 
           Margin="{StaticResource TextControlThemePadding}" /> 
     </ScrollViewer> 

    </Grid> 
</ControlTemplate> 

そして、これらは使用して使用されています。

<UserControl ... 
      xmlns:con="using:Scanners.Tetra.UWPmvvm.Helpers"> 
... 
    <ContentControl x:Name="lblReturnText" 
        Template="{StaticResource BorderedTextBlock}" 
        Content="{Binding ReturnText}" 
        Background="#DDDDDD" 
        con:AttachedPropertyExtensions.BackgroundVisible="{Binding ReturnText, Converter={StaticResource HasContentConverter}}" /> 
    <ContentControl x:Name="lblErrorText" 
        Template="{StaticResource BorderedTextBlock}" 
        Content="{Binding ErrorText}" 
        Background="#C03556" 
        con:AttachedPropertyExtensions.BackgroundVisible="{Binding ErrorText, Converter={StaticResource HasContentConverter}}" /> 
</UserControl> 

HasContentConverter:

class HasContentConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     string val = (string)value; 
     string.IsNullOrWhiteSpace(val)) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Collapsed 
     } 
    ... 

アプリケーションは(ARM、モバイルデバイス上で展開されている)を実行したとき、私は

Path=(con:AttachedPropertiesExtensions.BackgroundVisible) 

Path=con:AttachedPropertiesExtensions.BackgroundVisible 

を変更すると、次のエラーが出力に

Error: BindingExpression path error: 'con:AttachedPropertiesExtensions' property not found on 'Windows.UI.Xaml.Controls.ContentControl'. BindingExpression: Path='con:AttachedPropertiesExtensions.BackgroundVisible' DataItem='Windows.UI.Xaml.Controls.ContentControl'; target element is 'Windows.UI.Xaml.Controls.Border' (Name='backgroundBorder'); target property is 'Visibility' (type 'Visibility') 

を表示されます

(かっこ付きのもの)ControlTemplate全体をビルドするとエラーが発生します。

The text associated with this error code could not be found. 
E_UNKNOWN_ERROR 

プロパティにバインドを設定するにはどうすればよいですか?

+1

まず、正しく静的な読み取り専用フィールドに名前を付ける: 'パブリック静的な読み取り専用のDependencyProperty BackgroundVisibleProperty = ... .' –

+0

okですが、添付されたプロパティは 'ContentControl'で動作しているようです:' HasContentConverter'のブレークポイントが正常に途切れて、そこからメッセージが出力されません。実際のテンプレート内の境界線で「可視性」へのバインディングで使用された場合のみ –

答えて

0

私たちは依然としてWin7上にいるので、UWPをテストすることはできませんが、WPFでは、名前を含めて、接続プロパティの定義は問題ありません。私はその部分について間違っていたように見えます。私はまだコンベンションに従うために名前を変更しますが、WPFは気にしません。おそらくUWPは - 私は確信しています。

あなたのコードをテストしてくれた私にとって壊れていたものは、バインディングパスでした。それは添付プロパティですので、Pathの周りに括弧を必要とし、彼らは、C#のプロパティの命名規則に従わない名前を複雑にしています

Visibility="{Binding (con:AttachedPropertyExtensions.BackgroundVisible), RelativeSource={RelativeSource TemplatedParent}}" 

Path周りの括弧は、文字列全体が1つの手の込んだを示すことを知らせますプロパティ名のため、DependencyProperty定義フィールドの場合はcon:AttachedPropertyExtensions.BackgroundVisibleになります。それ以外の場合、は、BackgroundVisibleという独自のプロパティを持つテンプレート化された親のプロパティであると考えられます。しかしそれは意味をなさない。これが構文エラーではない場合でも:

public Visibility con:AttachedPropertyExtensions{ get; set; } 

...ここでは通信しようとしているものではありません。

私はあなたの元BindingPresentationTraceSources.TraceLevel=Highを追加する場合は、ここではそれが失敗したデバッグトレース出力の一部だ:

System.Windows.Data Warning: 108 : BindingExpression (hash=4917414): At level 0 - for ContentControl.con:AttachedPropertyExtensions found accessor <null>

System.Windows.Data Error: 40 : BindingExpression path error: 'con:AttachedPropertyExtensions' property not found on 'object' ''ContentControl' (Name='')'. BindingExpression:Path=con:AttachedPropertyExtensions.BackgroundVisibility; DataItem='ContentControl' (Name=''); target element is 'Border' (Name=''); target property is 'Visibility' (type 'Visibility')

System.Windows.Data Warning: 103 : BindingExpression (hash=4917414): Replace item at level 1 with {NullDataItem}

+1

Hmm。私はそれを試みたが、Visual Studioはビルド時に 'E_UNKNOWN_ERROR'エラーを投げた。私はちょうどVisual Studioを昼休みに閉じてもう一度試しましたが、今回はうまくいきました。私の推測ではVSが混乱していたことです(UWPでかなりやっているようです)。ありがとう –

+0

@JonathanTwite 2008年以降、Visual Studioはすべてのリリースでより簡単に混乱します。 –

関連する問題