Данные не отображаются в UserControl - PullRequest
0 голосов
/ 04 марта 2020

Когда я запускаю код, данные не отображаются в пользовательском интерфейсе. Данные находятся в объекте Person, но не отображаются в пользовательском интерфейсе.

Список заполняется. В объекте person есть 10 элементов, и я вижу 10 элементов, которые создаются в пользовательском интерфейсе, но имя и возраст не отображаются.

enter image description here

In Предварительный просмотр Visual Studio. Я вижу данные

enter image description here

UserControl XAML

<UserControl x:Class="BlankApp1.Views.PersonUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:prism="http://prismlibrary.com/"             
         prism:ViewModelLocator.AutoWireViewModel="True">
  <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <TextBlock Text="{Binding Name}" Margin="10 3"/>
    <TextBlock Text="{Binding Age}" Margin="10 3" Grid.Column="1"/>
  </Grid>
</UserControl>

Модель

public class PersonModel : ObservableBase
{
    private string name;
    public string Name
    {
        get { return name; }
        set { Set(ref name, value); }
    }

    private int age;
    public int Age
    {
        get { return age; }
        set { Set(ref age, value); }
    }
}

MainViewModel

public class MainWindowViewModel : BindableBase
{
    private string _title = "Prism Application";
    public string Title
    {
        get { return _title; }
        set { SetProperty(ref _title, value); }
    }

    public MainWindowViewModel()
    {
        Mock();
    }

    public ObservableCollection<PersonModel> Persons { get; set; }
    = new ObservableCollection<PersonModel>();

    private Random rand = new Random();

    private void Mock()
    {
        for (int i = 0; i < 10; i++)
        {
            Persons.Add(new PersonModel
            {
                Name = string.Format("Person {0}", i),
                Age = rand.Next(20, 50)
            });
        }
    }
}

MainView XAML

<Window x:Class="BlankApp1.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    xmlns:local="clr-namespace:BlankApp1.ViewModels"
    xmlns:model="clr-namespace:BlankApp1"
    xmlns:view="clr-namespace:BlankApp1.Views"
    prism:ViewModelLocator.AutoWireViewModel="True"
    Title="{Binding Title}" Height="350" Width="525">

<Window.DataContext>
    <local:MainWindowViewModel/>
</Window.DataContext>
  <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition />
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <Grid.Resources>
        <DataTemplate DataType="{x:Type model:PersonModel}">
            <view:PersonUserControl/>
        </DataTemplate>
    </Grid.Resources>

    <TextBlock Text="ItemsControl Example" FontWeight="Bold" Margin="4 10"/>
    <Border BorderThickness="1" BorderBrush="Silver" Margin="4" Grid.Row="1">
        <ScrollViewer HorizontalScrollBarVisibility="Hidden"

                      VerticalScrollBarVisibility="Auto">
            <ItemsControl ItemsSource="{Binding Persons}"/>
        </ScrollViewer>
    </Border>

    <TextBlock Text="ListBox Example" FontWeight="Bold" Margin="4 10" Grid.Column="1"/>
    <ListBox ItemsSource="{Binding Persons}" Margin="4" Grid.Row="1" Grid.Column="1">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            </Style>
        </ListBox.ItemContainerStyle>
    </ListBox>
  </Grid>
</Window>

1 Ответ

2 голосов
/ 04 марта 2020

prism:ViewModelLocator.AutoWireViewModel="True" устанавливает DataContext PersonUserControl для модели представления, что означает, что привязка к свойствам PersonModel объекта, который вы создаете в MainWindowViewModel, завершается неудачей.

Поэтому вы должны удалить prism:ViewModelLocator.AutoWireViewModel="True" из разметки XAML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...