Reputation: 211
I used Blend for VS 2012 to create a template of a WP7.8 application. There were some sample data (located in a separate xaml file, see lower) which were shown in a design mode on the silverlight page correctly. Changing this data (with namespaces and class names) lead to editor errors and new data is not displayed in the design mode anymore. (the List component is shown as empty)
the main xaml file of the page is the following
<phone:PhoneApplicationPage
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="800"
x:Class="DesignSketch.MainPage"
d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<!--Pivot Control-->
<controls:Pivot Title="Application">
<!--Pivot item one-->
<controls:PivotItem Header="List">
<!--Double line list with text wrapping-->
<ListBox x:Name="FirstListBox" ItemsSource="{Binding Items}" Margin="0,0,-12,0">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,17" Width="432" Height="78">
<TextBlock Text="{Binding Sum}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
<TextBlock Text="{Binding Description}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</controls:PivotItem>
</controls:Pivot>
</Grid>
</phone:PhoneApplicationPage>
as can be seen it uses
d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
for design mode binding. Howerever the error (hint) is shown "Errors found in MainViewModelSampleData.xaml"
the contents of this xaml is
<viewModels2:ExpensesPageVM
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels2="clr-namespace:DesignSketch"
>
<viewModels2:ExpensesPageVM.Items>
<viewModels2:Expense Sum="10" Description="Fee1" />
<viewModels2:Expense Sum="600" Description="Fee2" />
</viewModels2:ExpensesPageVM.Items>
</viewModels2:ExpensesPageVM>
for it the following hint-errors are shown
The attachable property Items was not found in type ExpensesPageVM
The type viewModels2:Expense was not found. Verify that you are not missing an assembly reference and that all referenced assemblies have been built
The classes ExpensesPageVM and Expense are both located in DesignSketch namespace and have the following code:
using System;
using System.Linq;
using System.ComponentModel;
using System.Collections.ObjectModel;
namespace DesignSketch
{
public class ExpensesPageVM : INotifyPropertyChanged
{
public ExpensesPageVM()
{
this.Items = new ObservableCollection<Expense>();
}
/// <summary>
/// A collection for ItemViewModel objects.
/// </summary>
public ObservableCollection<Expense> Items { get; set; }
private string _sampleProperty = "Sample Runtime Property Value";
/// <summary>
/// Sample ViewModel property; this property is used in the view to display its value using a Binding
/// </summary>
/// <returns></returns>
public string SampleProperty
{
get
{
return _sampleProperty;
}
set
{
_sampleProperty = value;
NotifyPropertyChanged("SampleProperty");
}
}
public bool IsDataLoaded
{
get;
private set;
}
/// <summary>
/// load initial data from sdf
/// </summary>
public void LoadData()
{
//...
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName)
{
if (null != PropertyChanged)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
other file
using System;
using System.Data.Linq.Mapping;
using System.ComponentModel;
namespace DesignSketch
{
[Table]
public class Expense: INotifyPropertyChanged, INotifyPropertyChanging
{
private int expenseID;
[Column(IsPrimaryKey = true,
IsDbGenerated = true,
DbType="INT NOT NULL Identity",
CanBeNull=false,
AutoSync=AutoSync.OnInsert)]
public int ExpenseID { get {return expenseID;}
set
{
if (expenseID == value) return;
NotifyPropertyChanging("ExpenseID");
expenseID = value;
NotifyPropertyChanged("ExpenseID");
}
}
private string description { get; set; }
[Column]
public string Description { get { return description; }
set
{
if (description == value) return;
NotifyPropertyChanging("Description");
description = value;
NotifyPropertyChanged("Description");
}
}
private decimal sum;
[Column]
public decimal Sum
{
get { return sum; }
set
{
if (sum == value) return;
NotifyPropertyChanging("Sum");
sum = value;
NotifyPropertyChanged("Sum");
}
}
private DateTime date;
[Column]
public DateTime Date { get { return date; }
set
{
if (date == value) return;
NotifyPropertyChanging("Date");
date = value;
NotifyPropertyChanged("Date");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangingEventHandler PropertyChanging;
private void NotifyPropertyChanging(string propertyName)
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
}
}
}
}
Expense is customized to be stored in a local db of the phone.
I have practically the same code working (generated by Blend) where the sample data is shown in a design time perfectly. Does anybody have a clue why it isn't with this code ?
Upvotes: 4
Views: 1881
Reputation: 489
If DesignSketch is not in the current assembly, then change this line
xmlns:viewModels2="clr-namespace:DesignSketch"
to
xmlns:viewModels2="clr-namespace:DesignSketch;assembly=NameOfAssemblyThatHoldsDesignSketch"
Upvotes: 1