私のアプリには、TextBox、Listpicker、および LongListSelector で構成される画面があります。
LongListSelector には、カテゴリが定義された場所のリストが含まれています。
listpicker から目的のカテゴリを選択するか、リストを検索して目的のリストを表示するテキスト ボックスにテキストを入力することで、リストを並べ替えることができます。
10 個のカテゴリがあり、私のコードは 9 個で正常に動作していますが、10 個目のカテゴリの場合、選択して検索ボックスに何かを入力し、それを消去するとアプリがクラッシュします。
私はどこでもtry catchを試みましたが、デバッガーに直接行き、ブレークし、デバッガーに表示される例外は
「レイアウト サイクルが検出されました。レイアウトを完了できませんでした。」
私のxamlコードは次のとおりです。
<phone:PhoneApplicationPage.Resources>
<local:Number x:Key="Number"/>
<DataTemplate x:Name="PickerFullItemTemplate">
<StackPanel>
<TextBlock Text="{Binding}" FontSize="36"/>
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="White" >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<Grid Grid.Row="0" Background="#132d63">
<TextBlock Foreground="white" Text="{Binding Path=LocalizedResources.Places,Source={StaticResource LocalizedStrings}}" Margin="0,6,0,8" FontSize="40" HorizontalAlignment="Center"/>
</Grid>
<Grid Grid.Row="1" >
<toolkit:PhoneTextBox Hint="{Binding Path=LocalizedResources.Search,Source={StaticResource LocalizedStrings}}" Text="{Binding searchtextbox,Mode=TwoWay,UpdateSourceTrigger=Default}" TextChanged="Searchbox_TextChanged" Name="Searchbox" FontSize="25" VerticalAlignment="Center" HorizontalAlignment="Stretch" Background="White" BorderBrush="Black" BorderThickness="1"/>
</Grid>
<Grid Grid.Row="2" Margin="12,0,12,0">
<toolkit:ListPicker ExpansionMode="ExpansionAllowed" FullModeHeader="Categories"
Name="listpicker"
ItemsSource="{Binding Categories,Mode=TwoWay,UpdateSourceTrigger=Default}" FullModeItemTemplate="{StaticResource PickerFullItemTemplate}" SelectedItem="{Binding listpickerselecteditem,Mode=TwoWay,UpdateSourceTrigger=Default}" BorderBrush="Black" BorderThickness="1" Background="White" Foreground="Black" Margin="0,-5,0,0"/>
</Grid>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="3" Margin="12,0,0,0">
<ls:LongListSelector1 x:Name="placesinfolist" Margin="0,10,0,10" ItemsSource="{Binding attractionlist,Mode=TwoWay,UpdateSourceTrigger=Default}" SelectedItem="{Binding SelectedAttractionDetail,Mode=TwoWay,UpdateSourceTrigger=Default}" />
</Grid>
</Grid>
私のコードビューモデルは
public class AttractionViewModel : ViewModelBase
{
List<AttractionDetails> newsearchlist = new List<AttractionDetails>();
Boolean Isgetattractionlist = false;
#region Properties
ObservableCollection<AttractionDetails> attractionlistbackup { get; set; }
private ObservableCollection<AttractionDetails> _attractionlist;
public ObservableCollection<AttractionDetails> attractionlist
{
get
{
return _attractionlist;
}
set
{
_attractionlist = value;
RaisePropertyChanged("attractionlist");
}
}
private bool _isLoading;
public bool IsLoading
{
get
{
return _isLoading;
}
private set
{
_isLoading = value;
RaisePropertyChanged("IsLoading");
}
}
private AttractionDetails _SelectedAttractionDetail;
public AttractionDetails SelectedAttractionDetail
{
get
{
return _SelectedAttractionDetail;
}
set
{
int index = 0;
_SelectedAttractionDetail = value;
RaisePropertyChanged("SelectedAttractionDetail");
for (int i = 0; i < attractionlist.Count(); i++)
{
if (attractionlist[i] == SelectedAttractionDetail)
{
index = i;
break;
}
}
Messenger.Default.Send<int>(index, "toattractiondetails");
IsLoading = true;
Messenger.Default.Send<ObservableCollection<AttractionDetails>>(attractionlist, "attractiondetails");
}
}
private List<string> _Categories;
public List<string> Categories
{
get
{
return _Categories;
}
set
{
_Categories = value;
}
}
private string _searchtextbox;
public string searchtextbox
{
get
{
return _searchtextbox;
}
set
{
try
{
_searchtextbox = value;
// RaisePropertyChanged("searchtextbox");
if (attractionlist == null)
attractionlist = new ObservableCollection<AttractionDetails>();
attractionlist.Clear();
if (listpickerselecteditem == null)
{
listpickerselecteditem = AppResources.All;
}
if (listpickerselecteditem == AppResources.All)
{
attractionlist.Clear();
foreach (var item in attractionlistbackup)
{
if (!(item.name.ToLowerInvariant().IndexOf(searchtextbox) == -1))
{
attractionlist.Add(item);
}
}
}
else
{
attractionlist.Clear();
foreach (var item in attractionlistbackup)
{
string qwe = "";
qwe = item.categoryType;
qwe = qwe.Replace("\r\n", string.Empty);
if (!(item.name.ToLowerInvariant().IndexOf(searchtextbox) == -1) && listpickerselecteditem == qwe)
{
attractionlist.Add(item);
}
}
}
}
catch (Exception e)
{
}
}
}
private string _listpickerselecteditem;
public string listpickerselecteditem
{
get
{
return _listpickerselecteditem;
}
set
{
_listpickerselecteditem = value;
RaisePropertyChanged("listpickerselecteditem");
if (attractionlist == null)
attractionlist = new ObservableCollection<AttractionDetails>();
attractionlist.Clear();
if (listpickerselecteditem == AppResources.All)
{
foreach (var item in attractionlistbackup)
{
if (searchtextbox != null)
{
if (!(item.name.ToLowerInvariant().IndexOf(searchtextbox) == -1))
{
attractionlist.Add(item);
}
}
else
{
attractionlist.Add(item);
}
}
}
else
{
foreach (var item in attractionlistbackup)
{
string qwe = "";
qwe = item.categoryType;
qwe = qwe.Replace("\r\n", string.Empty);
if (searchtextbox == null)
{
if (listpickerselecteditem == qwe)
attractionlist.Add(item);
}
else if (!(item.name.ToLowerInvariant().IndexOf(searchtextbox) == -1) && listpickerselecteditem == qwe)
{
attractionlist.Add(item);
}
}
}
}
}
#endregion
public AttractionViewModel()
{
Messenger.Default.Register<string>(this, "attraction", GetAttractions);
Messenger.Default.Register<string>(this, "toplacesview", setlist);
}
public void setlist(string message)
{
if (searchtextbox != message)
{
searchtextbox = message;
}
}
public void GetAttractions(string message)
{
}
}
私のコードビハインドは
public partial class Attractions : PhoneApplicationPage
{
public Attractions()
{
InitializeComponent();
}
private void Searchbox_TextChanged(object sender, TextChangedEventArgs e)
{
try
{
TextBox asd = sender as TextBox;
Messenger.Default.Send<string>(asd.Text, "toplacesview");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void GotoAttractionDetails(object sender, System.Windows.Input.GestureEventArgs e)
{
AttractionDetailsPage.flag = 0;
NavigationService.Navigate(new Uri("/Skins/AttractionDetailsPage.xaml", UriKind.Relative));
}
}
もう 1 つ、テキストが変更されるたびに textchanged イベントが 2 回発生します。なぜこれが起こっているのかわかりません。
助けてください.....