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

本文关键字:字符串 属性 数据绑定 文本 | 更新日期: 2023-09-27 18:26:54

我是Silverlight和数据绑定概念的新手,但我仍然无法解决问题。经过几天的研究,我还没找到解决方案。

这是我的问题:

我正确地将String属性绑定到我的TextBlock的文本,如下所示:

主页.xaml

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

WP8可显示.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_Loaded(object sender, RoutedEventArgs e)方法中的MainPage.xaml.cs中启动,并执行如下操作:

  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>

主页.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是否可以将多个实例链接到同一对象

如果有人作为线索或觉得我的问题不够清楚,请毫不犹豫地告诉我。

谢谢。

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

我建议您查看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

您的声明属性的方式是错误的。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根据上述代码更改您的代码。

谢谢,Hitesh。