Dev Drone Bhowmik
Dev Drone Bhowmik

Reputation: 86

Data no showing in UserControl

When i run the code, no data is shown in the UI. Data is there in the Person object but not showing in UI.

The list is getting populated. There are 10 items in the person object and i can see 10 items being created in the UI but the name and age are not showing.

enter image description here

In visual studio preview i can see data

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>

Model

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>

Upvotes: 0

Views: 75

Answers (1)

mm8
mm8

Reputation: 169200

prism:ViewModelLocator.AutoWireViewModel="True" sets the DataContext of the PersonUserControl to a view model which means that the binding to the properties of the PersonModel object that you create in the MainWindowViewModel fails.

So you should remove prism:ViewModelLocator.AutoWireViewModel="True" from the XAML markup.

Upvotes: 2

Related Questions