1

我在 Visual Studio 2012 中使用 C# 和 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. 创建正确的引用,以便 App.xaml.cs 中的 dispatcherTimer 可以调用 MainPage.xaml.cs 中设置 XAML 页面中的字段的例程。
4

2 回答 2

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类中公开 this 的静态实例,并在新数据进入时对此实例进行更新:

    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>";
    }

现在您已经拥有了 a 所需的一切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 回答