小编OrW*_*hen的帖子

初学者 - 对WPF中的绑定和资源感到困惑

我正在尝试学习WPF,但我发现很难理解绑定,"资源"事物和对象创建.我的背景是C++/MFC和C#-Winforms.

我的问题:

  1. 我在XAML中看到的大多数示例(在MSDN和我读过的其他两本WPF书籍中)都在绑定表达式中使用StaticResource.这些是否与静态成员有关?或者这只是一个误导性的名字?当作为StaticResource对任何对象进行引用时,它何时被实例化?

  2. 据我所知,StaticResources与app/window/control等"Resources"部分中定义的"things"一起使用.
    现在,这些参考资料部分对我来说非常混乱.究竟是什么?根据我在MFC中的经验,这些是图标,字符串等.但是,从我看到的所有示例来看,在WPF中,这些似乎基本上是(a)标记中的各种全局对象定义的"倾销场" (样式,数据模板等) (b)标记中的各种全局对象实例化我是否正确?这让我非常凌乱.
    它主要涉及在XAML中学习各种半DSL(用于定义样式,定义数据模板,创建对象等),并将它们粘贴在同一个地方.我一直在想像手工编辑MFC中的资源文件(.rc).至少那些部分是完全分开的,每个资源的语法都相对简单.

  3. 要理解前面两个问题:当我在参考资料部分定义一个对象实例,然后从StaticResource绑定中引用它时,它究竟何时被实例化?MSDN说(在"如何:使数据可用于XAML中绑定"中):

您可以使对象可用于绑定的一种方法是将其定义为资源

但是,这不是很清楚.他们的意思是什么?他们的意思是创造?它们是否意味着连接到绑定子系统?什么时候创建该对象?从一个简单的例子开始,我看到WPF似乎在尝试附加绑定时为我创建了这个对象.这更令人困惑.

编辑:在下面的karmicpuppet澄清后,我仍然对如何连接到Binding感到困惑.假设我有我的资源:

<local:Person x:Key="MyPerson" Name="Title"/> 
Run Code Online (Sandbox Code Playgroud)

(其中Person是一个名为Name的属性的类)然后在窗口中我有:

<TextBlock Text="{Binding Source={StaticResource MyPerson}, Path=Name}"/> 
Run Code Online (Sandbox Code Playgroud)

1)这是做什么的?它是否经历了相同的步骤 - 搜索资源然后将其应用于Text属性?MyPerson对象是在创建Window时创建的,还是稍后创建的?2)我是否必须使用绑定机制绑定到Name属性?我不能像你上面用myBrush那样直接绑定它吗?为什么我不能这样做?

<TextBlock Text="{StaticResource MyPerson, Path=Name}"/> 
Run Code Online (Sandbox Code Playgroud)

这只是框架方面的短视吗?我想我在这里失踪很多,但我似乎无法明白...

3)我尝试使用DynamicResource,但我对我采取的每一步都非常困惑.a)在我的单个Window类的代码中添加了一个带有DependencyProperty的DependencyObject(这个DependencyObject是否必要?)

public class SomeText : DependencyObject
{
    public string Header
    {
        get { return (string)GetValue(HeaderProperty); }
        set { SetValue(HeaderProperty, value); }
    }
    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.Register("Header", typeof(string), typeof(SomeText), new UIPropertyMetadata(0));
}
Run Code Online (Sandbox Code Playgroud)

b)在Windows.Resources中添加了一个实例(这对于DynamicResource是必要的吗?MSDN似乎说没有,但是如果是这样的话,我无法弄清楚如何在XAML中进行下一步)

c)我试过两个:

Text="{Binding Source={DynamicResource HeaderText}, Path=Header}"
Run Code Online (Sandbox Code Playgroud)

这给了我一个例外,并且

Text="{DynamicResource HeaderText}"
Run Code Online (Sandbox Code Playgroud)

但我无法理解将路径放到Header属性的位置.

这是我最近第五次尝试使用WPF,每次我都被这些看似简单的事情所困扰.我已经阅读了2本书,我真的试图理解MSDN的文章,但它们根本没有帮助.

wpf binding

28
推荐指数
2
解决办法
2万
查看次数

标签 统计

binding ×1

wpf ×1