Есть UserControl:
<UserControl x:Class="Noveno.Common.CheckEdit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Noveno.Common"
mc:Ignorable="d">
<Grid Margin="5 1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="7*"/>
<ColumnDefinition Width="8*"/>
</Grid.ColumnDefinitions>
<CheckBox x:Name="chkBox" Grid.Column="0">
<TextBlock x:Name="chkCatPitch" VerticalAlignment="Center" TextWrapping="Wrap" TextAlignment="Justify" Margin="5 0"/>
</CheckBox>
<TextBox x:Name="edtData" Grid.Column="1" Height="25" VerticalAlignment="Center"/>
</Grid>
</UserControl>
Для того чтобы как то натянуть на него модель ему нужны DependencyProperty, посему:
public partial class CheckEdit : UserControl, ICheckControl
{
public static DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsCheckedDP", typeof(bool), typeof(CheckEdit));
public static DependencyProperty EditTextProperty = DependencyProperty.Register("EditTextDP", typeof(string), typeof(CheckEdit));
public string Caption
{
get
{
return chkCatPitch.Text;
}
set
{
chkCatPitch.Text = value;
}
}
public string EditText
{
get
{
return edtData.Text;
}
set
{
edtData.Text = value;
}
}
public bool IsChecked
{
get
{
return (bool)chkBox.IsChecked;
}
set
{
chkBox.IsChecked = value;
}
}
public bool IsCheckedDP
{
get
{
PropertyGet();
return (bool)GetValue(IsCheckedProperty);
}
set
{
SetValue(IsCheckedProperty, value);
PropertySet();
}
}
public string EditTextdDP
{
get
{
PropertyGet();
return (string)GetValue(EditTextProperty);
}
set
{
SetValue(EditTextProperty, value);
PropertySet();
}
}
private void PropertySet()
{
chkBox.IsChecked = (bool)GetValue(IsCheckedProperty);
edtData.Text = (string)GetValue(EditTextProperty);
}
private void PropertyGet()
{
SetValue(IsCheckedProperty, chkBox.IsChecked);
SetValue(EditTextProperty, edtData.Text);
}
public CheckEdit()
{
InitializeComponent();
}
}
Но вот эти самые DependencyProperty не работают, ни в дизайне, ни в рантайме, и модель, судя по всему, на них не натягивается. Смотрел через отладку, свойства даже не отрабатывают. Словно их нет, или ничего в них не написано.
<common:CheckEdit Caption="Исполнитель" IsCheckedDP="True"/>
IsCheckedDP должен устанавливать состояние CheckBox. Но ничего не происходит ни в дизайнере, ни при запуске.
Мне по факту вроде как необходимо использовать еще более сложные кастомные элементы, но проблема скорее всего в том что я не могу привязать адекватно свойства с которыми бы работала модель.
UserControlи получайте кучу примеров с реализацией. У вас должно быть неx:Name="edtData", аText = "{Binding Text, ElementName=uc}", гдеuc- это указанное имя самого окна, без этого источник данных у контрола будет браться не от туда. Вон я например делал кнопки (правда там стиль, но все же). – EvgeniyZ Aug 11 '20 at 17:19