绑定到ViewModel和CodeBehind中的属性

时间:2013-11-22 22:28:22

标签: c# wpf xaml mvvm binding

我确信这是一个荒谬无知的问题,但无论如何我都会问它,因为我已经搜索过并且不理解我所看到的解决方案或者找不到我寻求的答案

我有一个MVVM应用程序。我的XAML设置为将DataContext设置为VM,其中屏幕上的数据项将从VM的属性中填充。我的CodeBehind并没有摆弄数据,只涉及与屏幕有关的事情。

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

我可以通过在我的VM中创建公共属性然后将CB中的值“注入”到VM来以错误的方式解决这个问题。我知道这会起作用,但这是一种迂回的方式来获得我想要的行为,它根本不是直截了当的,我相信这是错误的方法。

我四处搜寻并尝试了类似的事情:

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

(其中“MyFontSize”是一个公共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相关的工具提示,字体大小等)绑定到CodeBehind中的变量而不是将它们存放在VM中?

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

1 个答案:

答案 0 :(得分:2)

您可以使用RelativeSource AncestorType绑定到视图本身的属性:

<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();
    }
}

关于此主题的文章:

相关背景: