Моя цель состоит в том, чтобы повторно использовать ListView
и пару других элементов управления, которые находятся внутри UserControl
, который я разработал.
Ради краткости, представьте, что у меня есть класс Person
как этот, и список его экземпляров.
public class Person
{
public string Name { get; set; }
public string City { get; set; }
}
Мой MainWindow
:
<Window x:Class="ReusableListView.MainWindow"
...
WindowStartupLocation="CenterScreen"
Title="MainWindow" Height="600" Width="600">
<Grid>
<local:UCListView Margin="8"
ItemsSource="{Binding PersonList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
public partial class MainWindow : Window, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private ObservableCollection<Person> _personList = null;
public ObservableCollection<Person> PersonList
{
get { return _personList; }
set { _personList = value; OnPropertyChanged("PersonList"); }
}
private Person _selectedPerson = null;
public Person SelectedPerson
{
get { return _selectedPerson; }
set { _selectedPerson = value; OnPropertyChanged("SelectedPerson"); }
}
public MainWindow()
{
InitializeComponent();
PersonList = GetPeople();
}
private ObservableCollection<Person> GetPeople()
{
var list = new ObservableCollection<Person>
{
new Person() { Name = "Jane", City = "NYC" },
new Person() { Name = "John", City = "LA" }
};
return list;
}
}
Я хочу отобразить свойство Name
Person
как отдельные элементы вмой ListView
внутри UserControl
, а затем справа от него я хочу отобразить свойство City
выбранного человека.Итак, мой UserControl
выглядит так:
<UserControl x:Class="ReusableListView.UCListView"
...
x:Name="MyListViewUC"
d:DesignHeight="500" d:DesignWidth="580">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListView Grid.Column="0" MinWidth="256" Margin="8"
DataContext="{Binding ElementName=MyListViewUC}"
ItemsSource="{Binding ItemsSource}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Left" VerticalAlignment="Center"
Width="Auto" Margin="8" Background="Pink"
Text="{Binding Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<TextBox Grid.Column="1" Margin="8" Background="PaleGreen"/>
</Grid>
</UserControl>
И код UserControl
позади:
public partial class UCListView : UserControl
{
public UCListView()
{
InitializeComponent();
}
public object ItemsSource
{
get { return GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); }
}
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(object), typeof(UCListView), new PropertyMetadata(null));
}
Приведенный выше код сшит воедино из большинства примеров, которые я видел онлайн, включая SO.Вот мои проблемы и вопросы.
- Когда я запускаю это, ничего не отображается в списке
UserControl
.В чем проблема? - Как связать свойство
SelectedPerson
с UserContro.
, чтобы он знал, как отобразить правильный City
на основе выбора?