gpt4 book ai didi

c# - WPF 在代码隐藏中绑定(bind)到类成员

转载 作者:IT王子 更新时间:2023-10-29 04:10:37 30 4
gpt4 key购买 nike

很简单的问题,但似乎无法在这里找到完整的答案...

我需要在 xaml 中将数据绑定(bind)到代码隐藏中的类成员的属性。

<Window x:Class="Main">
<customcontrol Name="View" IsChecked="{Binding ElementName=RecordProp, Path=IsViewChecked}" />
...

后面的代码看起来像:

class Main 
{
...
private Record _record;
public Record RecordProp
{
get { return _record; }
}
...
}


class Record
{
public bool IsViewChecked
{
get; set;
}
}

我现在得到的东西不起作用,我做错了什么?

最佳答案

我在这里看到的是您的窗口的类名是 Main,您已经向它添加了一个 RecordProp 属性,并且您现在正在尝试绑定(bind)到名为 RecordProp 的元素的 IsChecked 属性。我认为您对名称的工作原理有点困惑。

x:Name 属性添加到 XAML 元素会在窗口类中创建一个具有该名称的字段。这允许您在代码中引用命名元素,这可能让您认为绑定(bind)可以做同样的事情。

但这不是绑定(bind)查找命名元素的方式。 x:Name 属性 获取 XAML 元素创建的对象,并在窗口的名称范围中以该名称注册它。 (请参阅 MSDN's article on XAML namescopes.)这就是绑定(bind)所要解析的元素名称。由于您从未将对象添加到名称范围,因此在绑定(bind)上设置 ElementName 属性将找不到它。

有几件事是您可以想象得到的。如果你真的想绑定(bind)到窗口的属性,你可以给窗口一个名字并使用属性路径绑定(bind)到属性:

<Window x:Name="MainWindow" x:Class="Main">
...
<customcontrol Name="View" IsChecked="
{Binding ElementName=MainWindow,
Path=RecordProp.IsViewChecked}" />

更简单的是在构造函数中设置数据上下文:

DataContext = this;

完成后,您可以像这样绑定(bind)到 RecordProp 属性(以及窗口的任何其他属性):

<customControl Name="View" IsChecked={Binding RecordProp.IsChecked}/>

当然,如果您需要将窗口的数据上下文设置为其他值,那将不起作用。

另一种可能性是像这样实现属性:

public Record RecordProp 
{
get { return (Record)Resources["RecordProp"]; }
set { Resources["RecordProp"] = value; }
}

您可以使用(例如)Binding {DynamicResource RecordProp}, Path=IsChecked" 绑定(bind)到它。因为它是一个动态资源,如果窗口外部的东西设置了窗口的 RecordProp 属性,它的绑定(bind)将刷新 - 如果您只是将 RecordProp 设置为属性(除非您实现更改通知),这是不会发生的事情。

关于c# - WPF 在代码隐藏中绑定(bind)到类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2366945/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com