2013-08-09 4 views
0

저는 Silverlight 및 데이터 바인딩 개념을 처음 사용하고 있으며 여전히 문제를 해결하지 못했습니다. 나는 며칠간의 연구 끝에 해결책을 찾을 수 없었다. 아래 볼 수문자열 속성에 텍스트 데이터 바인딩

내가 제대로 내 TextBlock의 텍스트에 String 속성을 바인딩 :

여기 내 문제가

에서 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"); 
    } 
} 

WP8Displayable 클래스의 인스턴스를 하나 이상 인스턴스화 할 수있는 스레드가 내 MainPage.xaml.cs에 있습니다. 인스턴스 중 하나 인 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> 

에서 MainPage.xaml 내가 동적 경우에서의 DataContext를 설정하는 방법

<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> 

? 그리고 동일한 객체에 둘 이상의 인스턴스를 연결할 수 있습니까?

실마리가 있거나 제 질문이 명확하지 않은 경우 주저하지 마십시오.

감사합니다.

+0

오른쪽에 코드에서 datacontext를 설정할 때 제목이 업데이트됩니까? – Mark

+0

예. 작동합니다. 제 바인딩이 괜찮은지 확인하려고했습니다. 하지만 WP8Displayable 인스턴스가 언제 그리고 얼마나 많이 생성 될지는 알 수 없습니다. – Yann

답변

1

MVVMLight을 작성하면 많은 보일러 플레이트 코드를 제거하는 데 도움이됩니다. INotifyPropertyChanged. 또한 수행하려는 작업에 가장 일반적으로 사용되는 IoC 컨테이너 (Inversion of Control)를 제공합니다. 당신은 하나의 간단한 버전을 구현할 수 있습니다 (아래 참조).

XAML에서 DataContext를 설정할 수 있지만 Object를 제공하는 클래스가 필요합니다. 예를 들어 다음과 같은 클래스를 작성할 수 있습니다 (프로젝트에 직접 추가하고 하위 폴더에 추가하지 않을 경우) :

public class Locator 
{ 
    public WP8Displayable WP8Displayable 
    { 
     get { return new WP8Displayable(); } 
    } 
} 

다음으로 앱에 Locator 클래스를 등록해야합니다.당신이보기 내에서 참조 할 수 있도록 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

+0

불행히도'ResourceDictionary'는 Silverlight 프로젝트에서 지원되지 않습니다. 그래서 잘 이해가된다면 XAML에서'DataContext'를 설정하는 데 사용할 수있는 클래스에 내 'WP8Displayable' 객체를 만들어야합니까? – Yann

+0

@Yann 죄송합니다. WP8 프로젝트에서 'ResourceDictionary'를 사용할 수있는 추가적인 네임 스페이스를 사용하여 한 줄을 너무 많이 삭제했습니다. – Mark

+0

@Yann 그리고 코드 숨김으로 사용하지 않는다면 예. 물론 클래스의 동일한 인스턴스를 반환하도록 메서드를 조정할 수 있습니다. 그래서 네,'WP8Displayable' 인스턴스를 여러 뷰의'DataContext'로 설정할 수 있습니다. – Mark

0

귀하의 방법은 잘못된 것입니다. Plz 아래와 같이 속성을 선언하십시오.

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

} 

Plz은 코드에 따라 상기 코드를 변경 UR :

#region INotifyPropertyChanged Members 

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

및 클래스의 메소드

코드 아래 물품 수 plz.

감사합니다. Hitesh.

+0

답변 해 주셔서 감사합니다.하지만 제 보정이 올바르게 작동하고 있습니다. WP8Displayable의 인스턴스를 만들고이 줄처럼'DataContext'를 설정하면 :'tbCanvasTitle.DataContext = instanceWP8Displayable; (내 코드에서 주석에있는 주석) 작동하지만 문제는 그 라인을 사용할 수 없다는 것입니다. – Yann

관련 문제