ContentControl
のControlTemplate
を作成していて、色付きの背景で囲まれた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
プロパティにバインドを設定するにはどうすればよいですか?
まず、正しく静的な読み取り専用フィールドに名前を付ける: 'パブリック静的な読み取り専用のDependencyProperty BackgroundVisibleProperty = ... .' –
okですが、添付されたプロパティは 'ContentControl'で動作しているようです:' HasContentConverter'のブレークポイントが正常に途切れて、そこからメッセージが出力されません。実際のテンプレート内の境界線で「可視性」へのバインディングで使用された場合のみ –