1

Visual Studio 2012 で C# と XAML を使用しています

MS は 2012 年に Visual Studio の多くを変更したため、Web 上で有効なソリューションを見つけることができませんでした。私は 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 のディスパッチャータイマーから呼び出すことができるようにすると、次のエラー メッセージが表示されます。

非静的フィールド、メソッド、またはプロパティ「OpenGOTO.MainPage.UTC_Data」にはオブジェクト参照が必要です

どうすればよいですか:

  1. データをフィールドにバインドします (ウィンドウ全体を更新しなくても自動的に更新されますか?)
  2. XAML ページのフィールドを設定する MainPage.xaml.cs のルーチンを App.xaml.cs の dispatcherTimer が呼び出せるように、正しい参照を作成します。
4

2 に答える 2

2

データから更新を取得するバインディングを使用するには、いくつかのことが必要です。

  • バインドするプロパティ
  • 変更通知の一部の実装。通常はINotifyPropertyChangedまたはを使用します。DependencyProperty
  • プロパティが宣言されているオブジェクトインスタンス

現在、これらはありません。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>";
    }

これで、に必要なものがすべて揃ったので、Bindingそれをページに公開するだけです。DataContextこれを行うには、デフォルトのバインディングソースであるページのを設定します。

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

今、あなたはあなたのをバインドすることができますTextBlock

    <TextBlock x:Name="UTC_Data"
            Text="{Binding Path=DateStr}"
            Padding="5" Style="{StaticResource TextBlockStyle1}"/>
于 2013-03-23T02:21:31.820 に答える
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}"/>
于 2013-03-23T01:29:47.983 に答える