C# 将文本数据绑定到字符串属性

C# 将文本数据绑定到字符串属性,c#,silverlight,data-binding,windows-phone-8,C#,Silverlight,Data Binding,Windows Phone 8,我不熟悉Silverlight和数据绑定的概念,但我仍然无法解决我的问题。经过几天的研究,我还没有找到解决办法 我的问题是: 我将字符串属性正确绑定到我的文本块的文本,如下所示: MainPage.xaml <Grid Background="Blue" DataContext="{StaticResource WP8Displayable}"> <TextBlock x:Name="tbCanvasTitle" TextWrapping="Wrap" Te

我不熟悉Silverlight和数据绑定的概念,但我仍然无法解决我的问题。经过几天的研究,我还没有找到解决办法

我的问题是:

我将
字符串
属性正确绑定到我的
文本块
的文本,如下所示:

MainPage.xaml

<Grid  Background="Blue"  DataContext="{StaticResource WP8Displayable}">
        <TextBlock x:Name="tbCanvasTitle" TextWrapping="Wrap" Text="{Binding titleDisplayable}" FontWeight="Bold" HorizontalAlignment="Center"/>          
</Grid>
<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>
    <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>
我的
MainPage.xaml.cs
中有一个线程,可以实例化
WP8Displayable
类的一个或多个实例。当一个实例调用
setTitle(字符串s)
我的文本块中的文本没有更新时,我的
DataContext
似乎没有正确设置

编辑:

我的线程是在
MainPage.xaml.cs
加载的
MainPage_(对象发送器,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

<Grid  Background="Blue"  DataContext="{StaticResource WP8Displayable}">
        <TextBlock x:Name="tbCanvasTitle" TextWrapping="Wrap" Text="{Binding titleDisplayable}" FontWeight="Bold" HorizontalAlignment="Center"/>          
</Grid>
<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>
    <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>

MainPage.xaml

<Grid  Background="Blue"  DataContext="{StaticResource WP8Displayable}">
        <TextBlock x:Name="tbCanvasTitle" TextWrapping="Wrap" Text="{Binding titleDisplayable}" FontWeight="Bold" HorizontalAlignment="Center"/>          
</Grid>
<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>
    <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?和是否可以将多个实例链接到同一对象?

如果有人认为我的问题不够清楚,请毫不犹豫地告诉我


多谢各位

我建议您检查一下,这将帮助您消除大量必须编写的锅炉铭牌代码,例如
INotifyPropertyChanged
。此外,它还为您提供了一个IoC容器(控制反转),该容器最常用于您尝试执行的任务。您可以自己实现一个简单的版本(参见下文)

您可以在XAML中设置DataContext,但您需要一个提供对象的类,因此,例如,您可以编写这样的类(我假设您直接将其添加到项目中,而不是子文件夹中):

接下来,您必须在App.xaml中注册定位器类,以便从视图中引用它:

<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

您对声明属性的方式是错误的。 请按以下方式申报财产

#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根据上述代码更改ur代码

谢谢,
Hitesh。

当您在代码隐藏右侧设置datacontext时,标题会更新?是的,它可以工作。我试过了,以确保我的装订是好的。但我不知道什么时候以及会创建多少WP8Displayable实例。不幸的是,Silverlight项目不支持
ResourceDictionary
。因此,如果我理解得很好,我必须在类中创建我的
wp8displaybable
对象,用于在XAML中设置
DataContext
,对吗?@Yann抱歉,我的错误删除了太多的一行,通过附加名称空间,您可以在WP8项目中使用
ResourceDictionary
。@Yann和yes,如果您不通过代码隐藏使用它。当然,您可以调整该方法,使其始终返回类的相同实例。因此,您可以将
wp8displaybable
实例设置为多视图的
DataContext
。多亏了您,我发现了“控制反转”模式。我实际上是在试图理解它,以便正确地应用它。@Yann是的,这就是这个方向。很抱歉,定位器方法应该是属性,否则它找不到它。此外,请确保将字符串YOURAPPNAME替换为实际的应用程序名称。感谢您的回答,但我的出价工作正常。如果我创建了一个WP8Displayable的实例,并将
DataContext
设置为这一行:
tbCanvasTitle.DataContext=instanceWP8Displayable(我代码中注释中的那一行)它工作正常,但问题是我不能使用那一行。