Понадобился мне в проекте TextBox c заголовком.
Не долго думая, с помощью интернета, подсмотрев немного чужого кода, изготовил себе компонент:
Исходный код:
public class KeyValueControl : Control
{
public static readonly DependencyProperty KeyProperty = DependencyProperty.Register(
"Key",
typeof(string),
typeof(KeyValueControl),
new PropertyMetadata(default(string)));
public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
"Value",
typeof(object),
typeof(KeyValueControl),
new FrameworkPropertyMetadata
{
DefaultValue = null,
BindsTwoWayByDefault = true,
DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
});
static KeyValueControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(KeyValueControl), new FrameworkPropertyMetadata(typeof(KeyValueControl)));
}
public string Key
{
get
{
return (string)GetValue(KeyProperty);
}
set
{
SetValue(KeyProperty, value);
}
}
public object Value
{
get
{
return GetValue(ValueProperty);
}
set
{
SetValue(ValueProperty, value);
}
}
}
XAML:
<Style TargetType="{x:Type myctrl:KeyValueControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type myctrl:KeyValueControl}">
<Border Margin="2"
BorderBrush="DarkBlue"
BorderThickness="2"
CornerRadius="2"
Padding="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<TextBlock Text="{Binding Key, RelativeSource={RelativeSource TemplatedParent}}" />
<TextBox Grid.Row="1"
IsReadOnly="True"
Text="{Binding Value,
RelativeSource={RelativeSource TemplatedParent},
UpdateSourceTrigger=PropertyChanged}"
/>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
В итоге несколько таких компонентов выглядят вот так:
И вроде бы всё хорошо, за парой исключений:
1. Как бы я не старался указать для компонента свойтво StringFormat , до TextBox всё равно не доходит.
<myctrl:KeyValueControl Key="Цена продажи" Value="{Binding SellPrice, Mode=OneWay, StringFormat=F2}" />
2. Как сделать для этого компонента настраиваемое свойство IsReadOnly ? Пока я жестко прописал его в стиле, а хотелось бы иметь что-то вида:
<myctrl:KeyValueControl Key="Цена продажи" Value="{Binding SellPrice, Mode=OneWay, StringFormat=F2}" IsReadOnly="True" />
Помогите разобраться. Заранее спасибо.