我是Silverlight和数据绑定概念的新手,我仍然无法解决我的问题。经过几天的研究,我无法找到解决方案。
这是我的问题:
我正确地将String
属性绑定到我的TextBlock
文本,如下所示:
MainPage.xaml中
<Grid Background="Blue" DataContext="{StaticResource WP8Displayable}">
<TextBlock x:Name="tbCanvasTitle" TextWrapping="Wrap" Text="{Binding titleDisplayable}" FontWeight="Bold" HorizontalAlignment="Center"/>
</Grid>
WP8Displayable.cs
public class WP8Displayable : IDisplayable, INotifyPropertyChanged
{
public String title { get; set; }
#region INotifyPropertyChanged Members
public string titleDisplayable
{
get
{
return title;
}
set
{
if (title != value)
{
title = value;
NotifyPropertyChanged("titleDisplayable");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
// Used to notify the page that a data context property changed
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion
public void setTitle(String s)
{
this.title = s;
NotifyPropertyChanged("titleDisplayable");
}
}
我的MainPage.xaml.cs
中有一个可以实例化WP8Displayable
类的一个或多个实例的线程。当其中一个实例调用setTitle(String s)
我的TextBlock中的文本未更新时,似乎我的DataContext
未正确设置。
编辑:
我的帖子在MainPage.xaml.cs
方法的MainPage_Loaded(object sender, RoutedEventArgs e)
中启动,并执行以下操作:
var instanceWP8Displayable = new WP8Displayable();
//tbCanvasTitle.DataContext = instanceWP8Displayable; HERE IS WHAT I WOULD LIKE TO DO ON XAML
instanceWP8Displayable.setTitle("my Title");
编辑2:App.xaml
<Application
x:Class="AMS.App"
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:windows="clr-namespace:System.Windows;assembly=System.Windows"
xmlns:ioC="clr-namespace:AMS.Controller">
<!--Application Resources-->
<Application.Resources>
<windows:ResourceDictionary>
<local:LocalizedStrings xmlns:local="clr-namespace:AMS" x:Key="LocalizedStrings"/>
<ioC:Locator x:Key="Locator" x:Name="Locator" />
</windows:ResourceDictionary>
</Application.Resources>
MainPage.xaml中
<Grid x:Name="LayoutRoot" Background="White">
<Grid Background="Blue" DataContext="{Binding Source={StaticResource Locator}, Path=WP8Displayable}">
<TextBlock x:Name="tbCanvasTitle" TextWrapping="Wrap" Text="{Binding titleDisplayable}" FontWeight="Bold" HorizontalAlignment="Center"/>
</Grid>
<Grid.DataContext>
<local:WP8Displayable />
</Grid.DataContext>
</Grid>
如何在这种情况下动态设置DataContext ?并且是否可以将多个实例链接到同一个对象?
如果有人作为线索或觉得我的问题不够明确,请不要犹豫告诉我。
谢谢。
答案 0 :(得分:1)
我建议您查看MVVMLight,这将有助于您消除大量必须编写的样板代码,例如INotifyPropertyChanged
。此外,它还为您提供了一个IoC容器(控制反转),它最常用于您尝试执行的任务。您可以自己实现一个简单版本(见下文)。
你可以在XAML中设置DataContext,但是你需要一个提供Object的类,所以你可以写一个这样的类(我假设你把它直接添加到项目而不是子文件夹中):
public class Locator
{
public WP8Displayable WP8Displayable
{
get { return new WP8Displayable(); }
}
}
接下来,您必须在App.xaml中注册Locator类,以便在视图中引用它:
<Application
...
xmlns:windows="clr-namespace:System.Windows;assembly=System.Windows"
xmlns:ioC="clr-namespace:YOURAPPNAME">
<!--Application Resources-->
<Application.Resources>
<windows:ResourceDictionary>
<local:LocalizedStrings xmlns:local="clr-namespace:AMS" x:Key="LocalizedStrings"/>
<ioC:Locator x:Key="Locator" x:Name="Locator" />
</windows:ResourceDictionary>
</Application.Resources>
...
</Application>
现在我们可以在XAML中设置DataContext:
<Grid Background="Blue" DataContext="{Binding Source={StaticResource Locator}, Path=WP8Displayable}">
<TextBlock x:Name="tbCanvasTitle" TextWrapping="Wrap" Text="{Binding titleDisplayable}" FontWeight="Bold" HorizontalAlignment="Center"/>
</Grid>
HTH
答案 1 :(得分:0)
您申报财产的方式是错误的。 Plz声明属性如下;
#region INotifyPropertyChanged Members
public string _titleDisplayable;
public string titleDisplayable
{
get
{
return _titleDisplayable;
}
set
{
if (_titleDisplayable != value)
{
_titleDisplayable = value;
NotifyPropertyChanged("titleDisplayable");
}
}
}
和在类方法中,plz写下代码:
public void setTitle(string s)
{
this.titleDisplayable = s;
}
Plz根据上面的代码更改了你的代码。
谢谢, 亚太区首席技术官Matt。