У меня есть tabcontrol с вкладкой, в которой есть ListView, и я хотел бы отобразить созданный мной пользовательский элемент управления под названием «BetterCheckBox». Я связал его со свойством public List<Option> Options { get; set; }
, которое после инициализации вручную добавил 3 параметра.
Вот мой XAML
<TabItem Header="Options">
<ListView x:Name="lstOptions" ItemsSource="{Binding Options}">
<ListView.ItemTemplate>
<DataTemplate>
<Controls:BetterCheckBox Text="{Binding Name}" Description="{Binding Description}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</TabItem>
В результате получается список, который кажется пустым. Сначала я думал, что моя привязка не работает, однако есть 3 очень маленькие строки, которые я могу выбрать, как вы можете видеть на скриншоте.

Для справки, я добавил свой элемент управления "BetterCheckBox" на вкладку местоположения, чтобы вы могли видеть, как это выглядит.

Мне было любопытно, поэтому я вместо этого поставил сетку, и я получил то, что ожидал.
В дополнение к этим тестам, чтобы попытаться выяснить, что не так, я также попробовал DataTemplates, которые использовали панели Wrap / Stack и TextBlocks, которые связывали эти свойства, и на них тоже были очень маленькие линии, такие же, как на первом скриншоте.
<TabItem Header="Options">
<ListView x:Name="lstOptions" ItemsSource="{Binding Options}">
<ListView.ItemTemplate>
<DataTemplate>
<WrapPanel>
<TextBlock Text="Name: "/>
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="Desc: "/>
<TextBlock Text="{Binding Description}"/>
</WrapPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</TabItem>
Я что-то упустил? Я новичок в WPF и чувствую, что упускаю что-то очень простое, или, может быть, я не могу отобразить свой пользовательский контроль таким образом?
Редактировать - добавление usercontrol по запросу:
public partial class BetterCheckBox : UserControl, INotifyPropertyChanged
{
public string Text { get => _text; set { _text = value; OnPropertyChanged("Text"); } }
public string Description { get => _desc; set { _desc = value; OnPropertyChanged("Description"); } }
public bool IsChecked { get => _isChecked; set { _isChecked = value; OnPropertyChanged("IsChecked"); } }
public event PropertyChangedEventHandler PropertyChanged;
private string _text = "Checkbox Text";
private string _desc = "Default description";
private bool _isChecked = false;
public BetterCheckBox()
{
InitializeComponent();
DataContext = this;
}
private void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
Использование DependencyProperty
public partial class BetterCheckBox : UserControl
{
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
"Text", typeof(string), typeof(BetterCheckBox), new PropertyMetadata("Default title")
);
public static readonly DependencyProperty DescriptionProperty = DependencyProperty.Register(
"Description", typeof(string), typeof(BetterCheckBox), new PropertyMetadata("Default description")
);
public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
"IsChecked", typeof(bool), typeof(BetterCheckBox), new PropertyMetadata(false)
);
public string Text { get => (string)GetValue(TextProperty); set => SetValue(TextProperty, value); }
public string Description { get => (string)GetValue(DescriptionProperty); set => SetValue(DescriptionProperty, value); }
public string IsChecked { get => (string)GetValue(IsCheckedProperty); set => SetValue(IsCheckedProperty, value); }
public BetterCheckBox()
{
InitializeComponent();
}
}