【问题标题】:Passing a string from C# to the XAML button将字符串从 C# 传递到 XAML 按钮
【发布时间】:2011-12-09 23:55:42
【问题描述】:

这是一个非常简单的问题:我在我的 C# 类中定义了一个字符串,我希望它是 XAML 按钮的内容。而已。我可以在里面放什么??????我知道这是基本的 WPF ......我会继续寻找答案。提前致谢。

我的 XAML

<Window x:Class="BarScore.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"
        >

    <StackPanel>
        <Button Name="Start" Content="???" Height="25" Width="100"
           Margin="20" />
    </StackPanel>
</Window>

我的 C# 代码

using System;
using System.Windows;
using System.Windows.Controls;

namespace BarScore
{
    public partial class MainWindow : Window
    {
        public string BUTTON_NAME_STR = "START";

        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

PS:我知道我可以去代码写:

Start.Content = BUTTON_NAME_STR;

但如果可能的话,我希望它是从 XAML 到 C#,而不是相反。

【问题讨论】:

  • 您已将 Binding 指定为您的标签之一。您在互联网上没有得到任何关于如何设置数据上下文以及如何进行绑定的最简单示例吗?
  • @AngelWPF 我找到了几个示例,但大多数都与资源(静态和动态)绑定,其他则与外部 xml 绑定。我已经包含了绑定,因为我虽然它可能是一种“绑定”语法。

标签: c# wpf binding button


【解决方案1】:

我怀疑你想要类似的东西:

<Button Name="Start" Content="{Binding BtnName}" />

但您可能需要为包含的表单/页面/任何内容设置数据上下文。

【讨论】:

  • 我已经尝试过您的解决方案,但它不起作用。没有显示错误,但没有显示按钮的内容值,只有一个空白按钮。您能解释一下“为包含的表单/页面/任何内容设置数据上下文”是什么意思吗?顺便说一句,我正在使用窗口。感谢您的尝试。
  • @Pimenta:我的意思是将窗口的DataContext 属性设置为包含数据的对象(可能是“this”)。或者,您可以在绑定本身中指定不同的绑定根。
  • 感谢您的更新,这是缺少的链接。 @Redburn 显示了完整的答案。
【解决方案2】:

假设您的 BtnName 属性位于父 Window 上,您可以使用以下内容:

<Button Name="Start" Content="{Binding BtnName,
    RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" />

【讨论】:

    【解决方案3】:

    @Jon Skeet 和@Steve Greatrex 的回答都是有效的,但我想向@Pimenta 解释一下。

    WPF 中的数据绑定与Source 相关。你可以

    1. 在 Binding 表达式上显式设置此源,就像@Steve 的回答中的情况一样(在他的情况下,它是一个相对源);

    2. 也可以是隐式的,如@Jon 的解决方案,在这种情况下,默认源是控件的DataContext,可以手动设置或从其父级继承。

    因此,为了使@Steve 的解决方案发挥作用,您所说的“C# 代码”应该是您的 xaml 背后的代码,他假定它是一个窗口(WPF 中的默认项)。

    要使@Jon 的解决方案起作用,您需要为您的按钮设置DataContext。要么直接写:

    Start.DataContext=this;
    

    或通过(在代码中)为 xaml 层次结构中某处的控件设置它。

    我希望这会有所帮助:)

    【讨论】:

    • @AbdoulMoumen 感谢您的解释
    【解决方案4】:

    要使绑定起作用,您需要将字段转换为如下所示的属性。

    using System;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace BarScore
    {
        public partial class MainWindow : Window
        {
            private string _BUTTON_NAME_STR = "START";
            public string BUTTON_NAME_STR
            {
               get
               {
                    return _BUTTON_NAME_STR;
               }
               set
               {
                    _BUTTON_NAME_STR = value;
               }
            }
    
            public MainWindow()
            {
                InitializeComponent();
                Start.DataContext=this;
            }
        }
    }
    

    然后将绑定设置为您的属性

    <StackPanel>
        <Button Name="Start" Content="{Binding BUTTON_NAME_STR}"
           Height="25" Width="100"
           Margin="20" />
    </StackPanel>
    

    上面还有一些链接:

    http://blogs.msdn.com/b/wpfsdk/archive/2006/10/19/wpf-basic-data-binding-faq.aspx

    http://msdn.microsoft.com/en-us/magazine/cc163299.aspx

    【讨论】:

    • 这正是我想要的。感谢您的努力和所有提供帮助的人。我无法汇总不同的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2015-12-23
    • 2020-05-28
    相关资源
    最近更新 更多