gpt4 book ai didi

c# - 绑定(bind)到 ViewModel 和 CodeBehind 中的属性

转载 作者:行者123 更新时间:2023-12-03 10:28:45 25 4
gpt4 key购买 nike

我有一个我确定是一个荒谬无知的问题,但我仍然在问它,因为我已经搜索和搜索,要么不理解我所看到的解决方案,要么没有找到我所寻求的答案。

我有一个 MVVM 应用程序。我的 XAML 设置为将 DataContext 设置为 VM,其中屏幕上的数据项是从 VM 的属性中填充的。我的 CodeBehind 不处理数据,只处理与屏幕相关的内容。

我现在要做的是将某些 UI 元素绑定(bind)到 foo.xaml.cs (CodeBehind) 文件中的属性。例如,我想指定 FontSize 绑定(bind)到 CB 中的属性,以便在 CB 中的 WindowInitialized 处理程序中,它可以检测屏幕尺寸并更改一个变量,所有屏幕项的 FontSize= 都绑定(bind)到该变量。

我可以通过在我的 VM 中创建公共(public)属性然后将 CB 中的值“注入(inject)”到 VM 中来解决这个错误的方法。我知道这会奏效,但这是一种获得我想要的行为的迂回方式,它一点也不简单,而且我相信这是错误的继续方式。

我四处搜索并尝试了以下方法:

    FontSize="{Binding RelativeSource={RelativeSource Self},Path="MyFontSize"

(其中“MyFontSize”是一个公共(public) int 属性)和我发现的各种其他示例,但没有一个有效。

具体地说,如果我的 CodeBehind 类被称为 NameChangeSetupMainWindow 并且这就是“MyFontSize”属性所在的位置,
public partial class NameChangeSetupMainWindow : Window
{
private int m_fontSize = 14;
public int MyFontSize
{
get { return m_fontSize; }
set
{
if (m_fontSize != value))
{
m_fontSize = (value > 0) ? value : 10;
}
}
}
...
... rest of the class...
...
}

并且 VM 称为 NameChangeSetupViewModel ,这就是“真实”数据所在的位置,DataContext 指向 ala:
<Window.DataContext>
<local:NameChangeSetupViewModel/>
</Window.DataContext>

XAML 中将那些 UI 项(与 UI、字体大小等相关的工具提示)绑定(bind)到 CodeBehind 中的变量而不是将它们容纳在 VM 中的语法是什么?

提前感谢您提供的任何指导。

最佳答案

您可以使用 RelativeSource AncestorType 绑定(bind)到 View 本身的属性:

<TextBlock FontSize="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=MyFontSize}" />

使用 ElementName也应该工作:
<Window x:Name="window">

<TextBlock FontSize="{Binding ElementName=window,Path=MyFontSize}" />
</Window>

编辑

这是我已确认工作的示例:

XAML
<Window x:Class="WpfAbc.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
ToolTip="{Binding RelativeSource={RelativeSource Self},Path=MyToolTip}"
>
<Grid>
<TextBlock Text="hello world" FontSize="{Binding RelativeSource={RelativeSource AncestorType=Window},Path=MyFontSize}" />
</Grid>
</Window>

后面的代码
public partial class MainWindow : Window
{
private int m_fontSize = 20;
public int MyFontSize
{
get { return m_fontSize; }
set
{
if (m_fontSize != value)
{
m_fontSize = (value > 0) ? value : 10;
}
}
}

public string MyToolTip
{
get { return "hello world"; }
}

public MainWindow()
{
InitializeComponent();
}
}

有关此主题的文章:
  • The RelativeSource markup extension
  • XAML binding declarations

  • 相关背景:
  • "Namescopes" in XAML (使用“ElementName”绑定(bind)到源时,源元素必须在同一名称范围内)
  • Visual tree vs logical tree in XAML (不在可视树中的元素,如 Popup 和 ContextMenu,不继承 DataContext。从这些元素绑定(bind)需要像 "data context spy" 技术这样的变通方法。)
  • 关于c# - 绑定(bind)到 ViewModel 和 CodeBehind 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20155696/

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