Databind文本到字符串属性

时间:2013-08-09 06:58:38

标签: c# silverlight data-binding windows-phone-8

我是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 ?并且是否可以将多个实例链接到同一个对象?

如果有人作为线索或觉得我的问题不够明确,请不要犹豫告诉我。

谢谢。

2 个答案:

答案 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。