2013-03-22 117 views
1

我使用C#& XAML與Visual Studio 2012綁定變量XAML領域

MS在2012年改變了太多的Visual Studio中,我一直沒能在網上找到可行的解決方案。我是C#/ XAML的新手,所以我不熟悉數據綁定,如果這確實是繼續進行的正確方法。

我需要顯示MainPage.xaml頁面上App.xaml.cs文件的變量。這些變量每隔100-300毫秒改變一次狀態,所以每次數據改變時都需要刷新頁面,這可能不是一個好主意。

下面是我的項目的代碼片段:

App.xaml.cs定義的變量和修改它們在dispatcherTimer:

namespace OpenGOTO 
{ 
    public partial class App : Application 
    { 
     public static string DateStrZ = ""; 
     public static string FubarTest { get; set; } 
    } 
} 

在MainPage.xaml中(這並不總是當前窗口)我將TextBlock:

<TextBlock x:Name="UTC_Data" Text="2012-08-01 03:29:07Z" Padding="5" Style="{StaticResource TextBlockStyle1}" /> 

在MainPage.xaml.cs中我有一個由dispatcherTimer稱爲例程更新字段:

public void SetFieldsTick() 
{ 
    UTC_Data.Text = App.DateStrZ; 
} 

如果我改變了對

public static void SetFieldsTick() 

,這樣我可以從App.xaml.cs dispatcherTimer調用它,我得到錯誤信息:

需要的對象引用對於非靜態字段,方法或屬性'OpenGOTO.MainPage.UTC_Data'

我該怎麼做:

  1. 將數據綁定到外地(並會自動無需刷新整個窗口更新?)
  2. 創建正確的引用,以便在dispatcherTimer在App.xaml.cs可以調用一個的MainPage常規.xaml.cs用於設置XAML頁面中的字段。

回答

1

爲什麼不能從App.xaml.cs中調用UTC_Data?

例如:

((MainPage) rootFrame.Content).UTC_Data.Text = DateStrZ; 

當然,直到你改變它像這樣UTC_Data將無法訪問:

<TextBlock x:FieldModifier="public" x:Name="UTC_Data" Text="2012-08-01 03:29:07Z" Padding="5" Style="{StaticResource TextBlockStyle1}"/> 
2

要使用綁定從數據獲取更新你需要幾個事情:

  • 的屬性綁定到
  • 一些實施變更通知,通常使用INotifyPropertyChangedDependencyProperty
  • 該財產被宣佈

您現在有沒有這些對象實例。通過使與屬性實現INotifyPropertyChanged存儲數據的對象開始:

public class MyBindableObject : INotifyPropertyChanged 
{ 
    private string _dateStr; 
    public string DateStr 
    { 
     get { return _dateStr; } 
     set 
     { 
      if (_dateStr == value) 
       return; 
      _dateStr = value; 

      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("DateStr")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

然後,您可以從您的App類揭露這種靜態實例,並進行更新,這種情況下,每當新的數據來自於:

private static MyBindableObject _bindingContainer = new MyBindableObject(); 
    public static MyBindableObject BindingContainer 
    { 
     get { return _bindingContainer; } 
    } 

    public static void SetNewData() 
    { 
     // use this anywhere to update the value 
     App.BindingContainer.DateStr = "<Your New Value>"; 
    } 

現在你擁有了你需要的所有東西,你只需要將它暴露給你的頁面。您可以通過設置您的網頁,這是默認綁定源的DataContext做到這一點:

public MainPage() 
    { 
     this.InitializeComponent(); 
     DataContext = App.BindingContainer; 
    } 

現在你可以綁定你TextBlock

<TextBlock x:Name="UTC_Data" 
      Text="{Binding Path=DateStr}" 
      Padding="5" Style="{StaticResource TextBlockStyle1}"/>