簡體   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