繁体   English   中英

绑定简单的WPF TextBox文本TwoWay

[英]Binding Simple WPF TextBox Text TwoWay

我很抱歉这个问题非常基础。 我刚刚学习了WPF,但我没有简单的双向绑定到textbox.text到string属性。

XAML代码:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApplication1"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid x:Name="StuInfo">
    <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="10,26,0,0" TextWrapping="Wrap" Text="{Binding Path=str,Mode=TwoWay}" VerticalAlignment="Top" Width="120"/>
    <Button x:Name="button" Content="Check" HorizontalAlignment="Left" Margin="10,67,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
</Grid>

C#代码

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        str = "OK";
    }

    public string str { get; set; }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        Console.WriteLine(str);
    }
}

首先,文本框不显示“OK”,但它是空白的。 然后,我在文本框中键入了不同的文本,例如:“blablabla”没有引号。 然后我单击按钮检查我的str属性是否已更新。 显然,str仍然包含“OK”。

我在这做错了什么? 我错过了什么来进行装订工作?

作为WPF的新手,所有这些Binding和DataContext爵士乐都会让人感到困惑。 让我们先从你的绑定表达式开始......

<TextBox Text="{Binding Path=str, Mode=TwoWay}"/>

这就是说你想将Text属性绑定到TextBoxDataContext DataContext本质上是TextBox从中获取数据的“东西”。 现在,这就是问题。 如果没有明确设置, DataContext将从可视树中的“上面”元素继承。 在您的代码中, TextBoxGrid元素继承它的DataContext ,而Grid元素又从Window元素继承它的DataContext 眼见DataContext是不是在你的设置Window中的默认值DataContext属性将被应用,这是null DataContext也没有在窗口的任何子元素中设置,通过继承,它将该窗口的所有子元素的DataContext设置为null

请务必注意,您已在绑定表达式中省略了Source属性。

<TextBox Text="{Binding Source=left_out, Path=str, Mode=TwoWay}"/>

省略此属性时,由于上述原因,绑定的源隐含为元素DataContext ,在本例中为null。 基本上,你的表达式在这里说的是你想要将你的text属性绑定到DataContext.str ,由WPF解析的是null.str

好的。 现在,我们如何将TextBox.Text绑定的DataContext设置为窗口的Code Behind,以便我们可以获得该str属性? 有几种方法可以做到这一点,但出于我们的目的,我们将专注于在TextBox.Text属性的绑定中显式设置它。 现在,绑定有三种不同的“源”类型属性。 “源”是我们希望我们的控件/元素绑定从中获取数据的地方。 我们有SourceRelativeSourceElementName 我们这里只关注ElementName ,但其他对于研究和理解至关重要。

所以,让我们命名我们的Window元素,以便我们可以通过ElementName属性访问它。

<Window x:Class="WpfApplication1.MainWindow"
        x:Name="_window"
        ...

现在我们可以在TextBox.Text绑定上设置ElementName属性来引用窗口。

<TextBox Text="{Binding ElementName=_window, Path=str, Mode=TwoWay}"/>

这意味着绑定将在尝试解析绑定时查找_window.str属性。 此时,您可能仍然不会在TextBox看到您的str值。 这是因为它的值是在窗口构造函数中的InitializeComponent方法之后设置的。 此功能是第一次解析绑定的位置。 如果在调用InitializeComponent之前设置str的值,则会看到TextBox反映的值。

这将我们带到依赖属性。 现在,只需知道依赖属性已内置更改通知,您的绑定需要它,以便它“知道”绑定何时更改以及何时再次解析绑定值。 是的,您可以在代码中使用INotifyPropertyChanged ,但在这种情况下使用DependencyProperties有很好的参数,这只会混淆此时的问题。 但是,这是另一个必须理解的事情。

这是str属性的DependencyProperty的代码。

public static readonly DependencyProperty StrProperty 
    = DependencyProperty.Register("Str", typeof(string), typeof(MainWindow), 
        new FrameworkPropertyMetadata(FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public string Str
{
    get{return (string)GetValue(StrProperty);}
    set{SetValue(StrProperty,value);}
}

现在,您将能够像这样设置值,并通过绑定反映到TextBox

public MainWindow()
{
    InitializeComponent();
    Str = "OK";
}

在这一点上,一切都应该是好的。 我希望这会有所帮助。 我花了一段时间才得到了WPF。 我的建议是尽可能多地阅读DataContextBindingDependencyProperty因为它们是WPF的核心。 祝好运!

问题是,你不要绑定到Window的代码隐藏,而是绑定到DataContext。

尝试这个:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new DC();
    }

    public class DC
    {
        public string str { get; set; }

        public DC()
        {
            str = "OK";
        }
    }
}

通常,您将拥有两个不同的文件,但是对于测试,您可以在一个文件中执行此操作。 之后,您的DC(DataContext)应该实现INotifyPropertyChanged接口。

试着找一些关于MVVM的文章http://www.codeproject.com/Articles/165368/WPF-MVVM-Quick-Start-Tutorial

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM