问题描述
|
我对Silverlight和Windows 7手机的开发还很陌生。而且我不确定我错过了什么,但是显然我错过了一些东西,因为它没有按预期工作。
我的目标是显示生物列表,其中仅包含它们的名称和生命值。但是整个Text = {Binding}-东西显然不起作用。因此,我想知道你们中的任何人是否可以帮助我。
当我说它不起作用时,是因为数据在生物列表中,而不是在页面/文本块中-它显示正确数量的生物,但不是数据。
XAML
<phone:PhoneApplicationPage
x:Class=\"RPG_Assistent.Pages.DamageTrackerPage\"
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\"
FontFamily=\"{StaticResource PhoneFontFamilyNormal}\"
FontSize=\"{StaticResource PhoneFontSizeNormal}\"
Foreground=\"{StaticResource PhoneForegroundBrush}\"
SupportedOrientations=\"Portrait\" Orientation=\"Portrait\"
mc:Ignorable=\"d\" d:DesignHeight=\"768\" d:DesignWidth=\"480\"
shell:SystemTray.IsVisible=\"True\">
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name=\"LayoutRoot\" Background=\"Transparent\">
<Grid.RowDefinitions>
<RowDefinition Height=\"Auto\"/>
<RowDefinition Height=\"*\"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name=\"TitlePanel\" Grid.Row=\"0\" Margin=\"12,17,28\">
<TextBlock x:Name=\"ApplicationTitle\" Text=\"MY APPLICATION\" Style=\"{StaticResource PhoneTextNormalStyle}\"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name=\"ContentPanel\" Grid.Row=\"1\" Margin=\"12,12,0\">
<!--<Button Content=\"Damage\" Height=\"72\" HorizontalAlignment=\"Left\" Margin=\"0,618,0\" Name=\"btnDamage\" VerticalAlignment=\"Top\" Width=\"160\" Click=\"btnDamage_Click\" />
<TextBox Height=\"72\" HorizontalAlignment=\"Left\" Margin=\"158,0\" Name=\"txtDamage\" Text=\"\" VerticalAlignment=\"Top\" Width=\"286\" KeyUp=\"NumericOnlyTextBox_KeyUp\"></TextBox>-->
<ListBox ItemsSource=\"{Binding creatureList}\" Height=\"500\" HorizontalAlignment=\"Center\" Margin=\"6,6,0\" Name=\"listBox1\" VerticalAlignment=\"Top\" Width=\"400\">
<ListBox.ItemTemplate>
<DataTemplate>
<Button Width=\"400\" Height=\"120\" >
<Button.ContentTemplate>
<DataTemplate>
<StackPanel Orientation=\"Horizontal\" Height=\"80\" Width=\"200\">
<StackPanel Orientation=\"Vertical\" Height=\"40\">
<TextBlock Width=\"100\" FontSize=\"22\" Text=\"Name:\" Height=\"40\"/>
<TextBlock Width=\"100\" Text=\"{Binding Name}\" Height=\"40\"/>
</StackPanel>
<StackPanel Orientation=\"Vertical\" Height=\"40\">
<TextBlock Width=\"100\" FontSize=\"22\" Text=\"Hitpoints:\" Height=\"40\"/>
<TextBlock Width=\"100\" Text=\"{Binding HitPoints}\" Height=\"40\"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</Button.ContentTemplate>
</Button>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Grid>
<!--Sample code showing usage of ApplicationBar-->
<!--<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible=\"True\" IsMenuEnabled=\"True\">
<shell:ApplicationBarIconButton IconUri=\"/Images/appbar_button1.png\" Text=\"Button 1\"/>
<shell:ApplicationBarIconButton IconUri=\"/Images/appbar_button2.png\" Text=\"Button 2\"/>
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text=\"MenuItem 1\"/>
<shell:ApplicationBarMenuItem Text=\"MenuItem 2\"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>-->
CS-页面加载完毕后调用。(在我的DamageTracker页面上的InitializeComponent()之后调用)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
namespace RPG_Assistent.Pages
{
public partial class DamageTrackerPage : PhoneApplicationPage
{
List<Models.Creature> creatureList { get; set; }
public DamageTrackerPage()
{
InitializeComponent();
creatureList = new List<Models.Creature>();
#region ApplicationTitle Setup
ApplicationTitle.Text = Constants.AppName;
ApplicationTitle.TextAlignment = Constants.AppName_TextAlignment;
ApplicationTitle.FontSize = Constants.AppName_FontSize;
ApplicationTitle.FontWeight = Constants.AppName_FontWeight;
#endregion
//SetInputScope(txtDamage);
LoadCreatures();
DataContext = this;
}
public void LoadCreatures()
{
string name;
for (int i = 0; i < 10; i++)
{
name = \"Monster \" + i + 1;
creatureList.Add(new Models.Creature(name));
}
}
public void btnDamage_Click(object sender,RoutedEventArgs e)
{
}
#region textbox control - makes numeric only
private void SetInputScope(TextBox textBoxControl)
{
InputScopeNameValue digitsInputNameValue = InputScopeNameValue.TelephoneNumber;
textBoxControl.InputScope = new InputScope()
{
Names = {
new InputScopeName()
{
NameValue = digitsInputNameValue
}
}
};
}
private void MaskNumericInput(TextBox textBoxControl)
{
string[] invalidCharacters = { \"*\",\"#\",\",\"(\",\")\",\"x\",\"-\",\"+\",\" \",\"@\",\".\" };
for (int i = 0; i < invalidCharacters.Length; i++)
{
textBoxControl.SelectionStart = textBoxControl.Text.Length;
}
}
private void NumericOnlyTextBox_KeyUp(object sender,KeyEventArgs e)
{
MaskNumericInput((TextBox)sender);
}
#endregion
}
}
CS-Creature类,位于\“ Models \”文件夹中-因为我认为我会很聪明
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace RPG_Assistent.Models
{
public class Creature
{
public string Name { get; set; }
public int HitPoints { get; set; }
public string Type { get; set; }
public Creature(string name)
{
this.Name = name;
this.HitPoints = 0;
this.Type = \"Images/mob.jpg\";
}
public void Damage(int damage)
{
HitPoints += damage;
}
public void Bloodied()
{
switch (this.Type)
{
case \"Images/mob.jpg\":
this.Type = \"Images/mobhurt.jpg\";
break;
case \"Images/mobhurt.jpg\":
this.Type = \"Images/mob.jpg\";
break;
}
}
}
}
解决方法
由于要绑定到Creatures列表,因此无需放置Creature.Name。您应该可以将其更改为Text = {Binding Name}和Text = {Binding Hitpoints}
,看起来应该是Text = {Binding Name}或Text = {Binding HitPoints}
编辑:但是,Text = {Binding Path = Name}或Text = {Binding Path = HitPoints}也可以。
编辑2:对不起,我没有注意到你的评论。我的计算机中没有VS,所以我自己无法尝试,但尝试将DataTemplate上的DataType设置为Creature。
,将绑定更新为以下内容。我从绑定路径中放下了Creature。那应该工作
<StackPanel Orientation=\"Vertical\" Height=\"40\">
<TextBlock Width=\"100\" FontSize=\"22\" Text=\"Name:\" Height=\"40\"/>
<TextBlock Width=\"100\" Text=\"{Binding Path=Name}\" Height=\"40\"/>
</StackPanel>
<StackPanel Orientation=\"Vertical\" Height=\"40\">
<TextBlock Width=\"100\" FontSize=\"22\" Text=\"Hitpoints:\" Height=\"40\"/>
<TextBlock Width=\"100\" Text=\"{Binding Path=HitPoints}\" Height=\"40\"/>
</StackPanel>
,您始终使用直接绑定来绑定到DataContext,并且在将ItemsSource设置为列表时,DataContext会成为列表中它将表示的每一行的每个项目。因此,您的想法完全正确!
但是:ContentControl的行为相同。设置“ 5”的“ 4”时,基本上会覆盖内容的DataContext。因此,将ѭ6设置为StackPanel,它将自己呈现为StackPanel,但是您还将尝试绑定到StackPanel,而不是绑定到Creature对象。
因此,您可能需要这样做:
将内容StackPanel移至DataTemplate,将此DataTemplate设置为Button上的ContentTemplate,并将Button的内容设置为Creature对象的Binding,如下所示:
<Button Width=\"400\" Height=\"120\" Content=\"{Binding}\">
<Button.ContentTemplate>
<DataTemplate>
<StackPanel Orientation=\"Horizontal\" Height=\"80\" Width=\"200\">
<StackPanel Orientation=\"Vertical\" Height=\"40\">
<TextBlock Width=\"100\" FontSize=\"22\" Text=\"Name:\" Height=\"40\"/>
<TextBlock Width=\"100\" Text=\"{Binding Path=Name}\" Height=\"40\"/>
</StackPanel>
<StackPanel Orientation=\"Vertical\" Height=\"40\">
<TextBlock Width=\"100\" FontSize=\"22\" Text=\"Hitpoints:\" Height=\"40\"/>
<TextBlock Width=\"100\" Text=\"{Binding Path=HitPoints}\" Height=\"40\"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</Button.ContentTemplate>
</Button>
,我处理这些情况的首选方式是为视图设置一个集合。看起来像这样
public class CreatureList : ObservableCollection<Creature>
{
// at least implement the constructor
}
之后,您可以在窗口XAML定义中使用新的集合类。
<ResourceDictionary>
<local:CreatureList x:Key=\"creatures\" />
</ResourceDictionary>
本地名称空间的定义必须设置为将在其中找到CreatureList类的程序集名称空间。之后,您可以在列表框定义中使用定义的列表。
<ListBox Name=\"creatureListBox\" ItemsSource=\"{Binding Source={StaticResource creatures}}\">
<!-- Template definition for each entry -->
</ListBox>
要在窗口类中使用这些对象,您必须设置一些属性并将它们与指定的条目相关联。
public partial class DamageTrackerPage : PhoneApplicationPage
{
private readonly CreatureList creatureList;
}
在类的构造函数中,将属性绑定到指定的XAML定义。
public DamageTrackerPage() {
InitializeComponent();
creatureList = FindResource(\"creatures\") as CreatureList;
}
现在,当您将条目添加到列表或从列表中删除条目时,更改将自动更新到您的窗口。
至少这是我在WPF中所做的方式,但是我确定WinPhone应用程序应该是相同的。