Итак, я просто настроил проект и добавил пользовательский элемент управления UserControl, который выглядит следующим образом.
<Grid>
<ItemsControl ItemsSource="{Binding UserViewModel.Users}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<controls:UserCard/>
<TextBlock Text="{Binding Name}"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
Как видите, я пытался связать свойство Text
buti, но оно не связывается.
Теперь может быть много причин, почему он так себя ведет, поэтому я постараюсь сузить его.
Я создал BaseViewModel, который будет содержать мои ViewModels, и выглядит это так.
public class BaseViewModel : ObservableObject
{
public UserViewModel UserViewModel { get; set; } = new UserViewModel();
}
И тогда я настроил свою ViewModel следующим образом
public class UserViewModel : ObservableObject
{
public ObservableCollection<User> Users { get; set; } = new ObservableCollection<User>();
public UserViewModel()
{
Users.Add(new User{Name = "Riley"});
Users.Add(new User{Name = "Riley1"});
}
}
Просто, теперь у меня есть ObservableObject, который выглядит следующим образом и имеет дело с INPC
public class ObservableObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
А по моему MainView.xaml
Я установил DataContext примерно так
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new BaseViewModel();
}
}
То же самое для UserControl
И здесь я фактически добавляю UserControl, чтобы он отображался в MainWindow
<ItemsControl ItemsSource="{Binding UserViewModel.Users}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<controls:UserCard/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Теперь проблема в том, что он не связывает данные, я хочу отобразить свойство Name
из модели, но оно не отображается, и я не уверен, почему, если я пытаюсь связать его со свойством TextBlock в MainView напрямую работает нормально.
Я не уверен, почему он так себя ведет, и я хотел бы понять, почему.
Нужно ли использовать DependencyProperties? Или это просто случай, когда я создаю новый экземпляр BaseViewModel? Где я ошибся?