試圖將我的舊大腦包裹在 WPF 資料系結上。從我能想到的最簡單的場景開始:一個有效的在線示例,然后我對其進行了簡化。
我將一個簡單的string屬性系結到一個TextBlock. 沒用。然后當我將它封裝string在我自己的類中時,它作業得很好!
問題:為什么我的string財產不起作用,而我的班級卻起作用?
<Window x:Class = "DataBindingOneWay.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Height = "350" Width = "600">
<Grid>
<StackPanel Orientation = "Vertical" HorizontalAlignment="Center" Margin="0,100,0,0">
<TextBlock Text="{Binding Name1}" />
</StackPanel>
</Grid>
</Window>
using System.Windows;
namespace DataBindingOneWay
{
public partial class MainWindow : Window
{
public class Employee
{
public string? Name1 { get; set; } = "Paul";
}
public string? Name1 { get; set; } = "Peter";
public MainWindow()
{
InitializeComponent();
DataContext = new Employee();
// DataContext = Name1;
}
}
}
uj5u.com熱心網友回復:
FrameworkElement系結在從屬性派生的元素上設定的資料背景關系上運行DataContext。資料背景關系在元素樹中繼承。
在 XAML 元素上宣告資料系結時,它們通過查看其直接 DataContext 屬性來決議資料系結。資料背景關系通常是用于系結源值路徑評估的系結源物件。您可以在系結中覆寫此行為并設定特定的系結源物件值。如果未設定承載系結的物件的 DataContext 屬性,則會檢查父元素的 DataContext 屬性,依此類推,直到 XAML 物件樹的根。簡而言之,除非在物件上明確設定,否則用于決議系結的資料背景關系是從父級繼承的。
如果沒有資料背景關系集,或者您需要將其他元素作為系結源參考,則需要使用Binding或引數化 a 。SourceElementNameRelativeSource
系結可以配置為使用特定物件進行決議,而不是使用資料背景關系進行系結決議。
讓我們回顧一下如何系結在您的MainWindow. 最初沒有分配資料背景關系。因此,所有系結都Name1將失敗。我們能做什么?這里有幾個選項(還有更多)。
在代碼隱藏中將
DataContextof設定為MainWindow。thispublic MainWindow() { InitializeComponent(); DataContext = this; }這意味著所有控制元件都繼承了
MainWindowas 系結源。因此,我們可以像這樣系結Name1屬性:<TextBlock Text="{Binding Name1}"/>這是要在系結源上系結的屬性
Name1的名稱(或屬性路徑)。Name1因此,如果我們只是直接從視窗開始賦值DataContext,那么我們將需要參考系結源本身,這就是{Binding}沒有屬性路徑的情況。public MainWindow() { InitializeComponent(); DataContext = Name1; }<TextBlock Text="{Binding}"/>如果不設定 a
DataContext,您仍然可以使用ElementName(需要x:Name分配給目標控制元件)或RelativeSource從當前元素遍歷父元素直到到達根目錄來參考元素樹中的元素。<TextBlock Text="{Binding Name1, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}}"/>此示例轉換為:
MainWindow在元素樹上搜索型別的系結源,如果找到,則系結到它的Name1屬性。正如您所看到的,如果屬性是在控制元件本身上定義的,就像在您的示例中一樣,這不一定需要資料背景關系。盡管如此,DataContext如果沒有什么阻止它,通常你會使用該屬性,因為它很容易被繼承。
我希望你看到它并沒有什么真正的神奇之處。關于系結語法(可能會令人困惑),有一個很好的檔案應該可以消除你的很多問號:
- 系結路徑語法
- 資料系結概述 (WPF .NET)
我不得不想:字串類中的什么欄位,或者更確切地說,屬性實際上保存了字串的“值”?
獎金回合:您根本不需要擔心這一點。您系結到該string屬性,WPF 知道如何顯示它,無需使用內部結構,但出于教育目的,檔案指出:
字串是用于表示文本的字符的順序集合。物件是表示字串的物件
String的順序集合;System.Char一個System.Char物件對應一個 UTF-16 編碼單元。物件的值是String物件的順序集合的內容System.Char,并且該值是不可變的(即,它是只讀的)。
該string型別使用其 indexer 屬性公開此字符陣列Chars。
uj5u.com熱心網友回復:
因為當您系結到字串時,您要系結的物件Name1 內部沒有。也就是說,里面沒有Name1(Name1會是什么結果Name1.Name1?)。但是,物件Name1內部有一個Employee(結果會是什么Employee.Name1?)
uj5u.com熱心網友回復:
如果你想訪問你的Name1屬性,MainWindow你應該設定DataContext為this(這是 MainWindow 實體)而不是Name1.
using System.Windows;
namespace DataBindingOneWay
{
public partial class MainWindow : Window
{
public class Employee
{
public string? Name1 { get; set; } = "Paul";
}
public string? Name1 { get; set; } = "Peter";
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
}
}
或從另一邊 - 當您希望將Name1屬性設定為DataContext系結MainWindow時應如下所示:
<Window x:Class = "DataBindingOneWay.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
Height = "350" Width = "600">
<Grid>
<StackPanel Orientation = "Vertical" HorizontalAlignment="Center" Margin="0,100,0,0">
<TextBlock Text="{Binding}" />
</StackPanel>
</Grid>
</Window>
uj5u.com熱心網友回復:
感謝 Jonathan 鼓舞人心的回應,我不得不思考:字串類中的哪個欄位,或者更確切地說,屬性實際上保存了字串的“值”?
我玩了所有東西,但似乎沒有什么能抓住實際的弦!(詭異的)。那就是我有一個瘋狂的想法并嘗試簡單的地方
<TextBlock Text="{Binding}" />
和
DataContext = Name1;
而且......這有效!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506328.html
