2012-05-24 90 views
1

我想將文本框綁定到在代碼隱藏文件中定義的窗口屬性。通過窗口名稱綁定到代碼後面的屬性

當使用「FindAncestor」設置RelativeSource來查找窗口時,引用窗口時綁定成功。

爲什麼通過名稱來引用窗口不起作用,就像我可以綁定窗口的「Title」屬性一樣?

XAML:

<Window x:Class="WpfApplication123.MainWindow" 
     x:Name="MyWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="WPF Binding Example" Height="180" Width="237"> 
<Grid> 
    <TextBox Height="23" HorizontalAlignment="Left" Margin="24,24,0,0" Name="textBox1" VerticalAlignment="Top" Width="136" 
      Text="{Binding ElementName=MyWindow, Path=Title}"/> 
    <TextBox Height="23" HorizontalAlignment="Left" Margin="24,53,0,0" Name="textBox2" VerticalAlignment="Top" Width="136" 
      Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=XYZ}"/> 
    <TextBox Height="23" HorizontalAlignment="Left" Margin="24,82,0,0" Name="textBox3" VerticalAlignment="Top" Width="136" 
      Text="{Binding ElementName=MyWindow, Path=XYZ}" /> 
    </Grid> 
</Window> 

後面的代碼:

namespace WpfApplication123 
{ 
    public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 
     XYZ = "XYZ!"; 
    } 

    public string XYZ { get; set; } 
    } 
} 

回答

1

你可以設置this.DataContext = this然後綁定到路徑。

你需要

XYZ = "XYZ"; 

之前在InitializeComponent

當文本框被初始化XYZ是空

+0

關鍵的一點是WPF在IntializeComponent()期間取得了屬性的值。當時,該物業尚未確定。感謝您的澄清!在窗口類中設置DataContext只是在XAML中使用ElementName的替代方法。 –

1

我從來沒有使用正常的產權,但我的猜測是,你需要實現INotifyPropertyChanged接口,並提高性能在XYZ的setter中改變了事件。 imho更好的方法是直接使用依賴屬性。

只要使XYZ成爲依賴項屬性,它就可以工作。

+0

依賴屬性或執行INotifyPropertyChanged的是沒有必要的,我簡單的例子,因爲我側重於初始狀態(剛剛顯示窗口時)。在構造窗口對象之後使用FindAncestor,所以在那個時候,我的屬性被設置並且值被顯示在文本框中。感謝您的反饋! –

相關問題