我懷疑錯誤「無法創建MainViewModel的實例」是責任,但要完全誠實,我不確定。這是Visual Studio給我的唯一錯誤,代碼編譯和運行,儘管它;我遇到的問題是我的Listbox不顯示我的表中的數據。Table-Listbox數據綁定不會導致數據顯示
從MainPage.xaml中相關樣品:
<phone:PhoneApplicationPage
x:Class="CarpetQuote.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
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="768"
d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}" />
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox x:Name="MainListBox" Margin="0,0,-12,0" ItemsSource="{Binding Carpets}" SelectionChanged="MainListBox_SelectionChanged" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding carpetName}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</phone:PhoneApplicationPage>
下面MainViewModelSampleData.xaml;這是負責「無法創建MainViewModel的實例」的頁面。
<local:MainViewModel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CarpetQuote"
SampleProperty="Sample Value">
<local:MainViewModel.Items>
<local:ItemViewModel LineOne="design one" LineTwo="Maecenas praesent accumsan bibendum" LineThree="Maecenas praesent accumsan bibendum dictumst eleifend facilisi faucibus habitant inceptos interdum lobortis nascetur"/>
<local:ItemViewModel LineOne="design two" LineTwo="Dictumst eleifend facilisi faucibus" LineThree="Pharetra placerat pulvinar sagittis senectus sociosqu suscipit torquent ultrices vehicula volutpat maecenas praesent"/>
<local:ItemViewModel LineOne="design three" LineTwo="Habitant inceptos interdum lobortis" LineThree="Accumsan bibendum dictumst eleifend facilisi faucibus habitant inceptos interdum lobortis nascetur pharetra placerat"/>
<local:ItemViewModel LineOne="design four" LineTwo="Nascetur pharetra placerat pulvinar" LineThree="Pulvinar sagittis senectus sociosqu suscipit torquent ultrices vehicula volutpat maecenas praesent accumsan bibendum"/>
<local:ItemViewModel LineOne="design five" LineTwo="Sagittis senectus sociosqu suscipit" LineThree="Dictumst eleifend facilisi faucibus habitant inceptos interdum lobortis nascetur pharetra placerat pulvinar sagittis"/>
<local:ItemViewModel LineOne="design six" LineTwo="Torquent ultrices vehicula volutpat" LineThree="Senectus sociosqu suscipit torquent ultrices vehicula volutpat maecenas praesent accumsan bibendum dictumst eleifend"/>
</local:MainViewModel.Items>
</local:MainViewModel>
我讀過一些關於錯誤的其他地方,但沒有相當似乎幫助。普遍的共識似乎是,編譯器不喜歡我的MainViewModel構造函數中的某些東西,但是我唯一需要的行是db = new CarpetContext(App.ConnString);
,並且在功能上相同的代碼在另一個項目中運行時沒有錯誤。
如果這個錯誤不是責任失敗的綁定,這裏是App.xaml.cs的相關部分,其中數據庫創建。
public partial class App : Application
{
private static MainViewModel viewModel = null;
public static MainViewModel ViewModel
{
get
{
if (viewModel == null)
{
viewModel = new MainViewModel();
}
return viewModel;
}
}
private static string connString = null;
public static string ConnString { get { return connString; } }
public App()
{
// Autogenerated code and comments snipped
if (connString == null)
{
connString = Resources["IsoDBConn"] as string;
}
createDB();
}
private void createDB()
{
using (var db = new CarpetContext(ConnString))
{
if (!db.DatabaseExists())
{
db.CreateDatabase();
}
}
}
private void Application_Activated(object sender, ActivatedEventArgs e)
{
if (!App.ViewModel.isDataLoaded)
{
App.ViewModel.loadData();
}
}
}
最後(我感覺真的很糟糕的代碼牆),從MainViewModel引用的函數。
public bool IsDataLoaded
{
get;
private set;
}
public void loadData()
{
db.Carpets.InsertOnSubmit(new Carpet("StainMaster", 10));
db.Carpets.InsertOnSubmit(new Carpet("Windsor", 12));
db.Carpets.InsertOnSubmit(new Carpet("Homfray", 11.5m));
db.Carpets.InsertOnSubmit(new Carpet("Wall Street", 15));
db.Carpets.InsertOnSubmit(new Carpet("Axminster", 16.5m));
db.SubmitChanges();
Carpets = new ObservableCollection<Carpet>(db.Carpets.ToList());
this.isDataLoaded = true;
}