0

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

这是我的问题:

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

主页.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.csMainPage_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>

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

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

谢谢你。

4

2 回答 2

1

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

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

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>

高温高压

于 2013-08-09T08:37:46.927 回答
0

您声明财产的方式是错误的。请如下声明财产;

#region INotifyPropertyChanged Members

public string _titleDisplayable;
public string titleDisplayable
{
    get
    {
        return _titleDisplayable;
    }
    set
    {
        if (_titleDisplayable != value)
        {
            _titleDisplayable = value;
            NotifyPropertyChanged("titleDisplayable");
        }
    }
}

并在类方法中请编写以下代码:

public void setTitle(string s)
{
    this.titleDisplayable = s;

}

请按照上述代码更改您的代码。

谢谢,希特什。

于 2013-08-09T09:53:53.593 回答