2011-01-19 34 views
6

Tất cả những gì tôi đang cố gắng thực hiện là liên kết thuộc tính công khai với một textBlock. Tôi làm gì sai ở đây?Cách dữ liệu tài sản công cộng trong xaml

namespace WpfApplication1 
{ 

    public partial class MainWindow : Window 
    { 

     public string test { get; set; } 

     public MainWindow() 
     { 
      test = "this is a test"; 
      InitializeComponent(); 
     } 
    } 
} 

<Window x:Class="WpfApplication1.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"> 
<Window.Resources> 
    <ObjectDataProvider x:Key="test"></ObjectDataProvider> 
</Window.Resources> 
<Grid> 
    <TextBlock Height="23" HorizontalAlignment="Left" Margin="108,58,0,0" Name="textBlock1" VerticalAlignment="Top" Text="{Binding Source={StaticResource test}}" /> 
</Grid> 

Trả lời

11

Bạn chỉ có thể thêm một DataContext và truy cập vào tài sản của bạn

public partial class MainWindow : Window,INotifyPropertyChanged 
{ 
    private string _test; 
    public string test 
    { 
     get 
     { 
      return _test; 
     } 
     set 
     { 
      _test = value; 
      OnPropertyChanged("test"); 
     } 
    } 
    public MainWindow() 
    { 
     test = "this is a test"; 
     InitializeComponent(); 
     DataContext = this; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(String name) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 
     <TextBlock Height="23" HorizontalAlignment="Left" Margin="108,58,0,0" Name="textBlock1" VerticalAlignment="Top" Text="{Binding test}"/> 

Ngoài ra kiểm tra bài này để biết chi tiết khi sử dụng một ObjectDataProvider

http://bea.stollnitz.com/blog/?p=22

6

Lúc đầu, bạn cần bạn lớp để thực hiện INotifyPropertyChanged hoặc một tài sản được DependencyProperty cho việc thay đổi giá trị tài sản về biến đổi văn bản textbox,

namespace WpfApplication1 
{ 
public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private string _test 
    public string test 
    { 
     get 
     { 
      return _test; 
     } 
     set 
     { 
      _test = value; 
      OnPropertyChanged("test"); 
     } 
    } 

    public MainWindow() 
    { 
     test = "this is a test"; 
     InitializeComponent(); 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

} 

hơn bạn có thể liên kết với tài sản đó bằng đặt tên cho cửa sổ đó và sử dụng thuộc tính ElementName như thế này.

<Window x:Class="WpfApplication1.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" Name="myWindow"> 
<Window.Resources> 
    <ObjectDataProvider x:Key="test"></ObjectDataProvider> 
</Window.Resources> 
<Grid> 
    <TextBlock Height="23" HorizontalAlignment="Left" Margin="108,58,0,0" Name="textBlock1" VerticalAlignment="Top" Text="{Binding ElementName=myWindow, Path=test}" /> 
</Grid> 
0

Bạn thực sự không cần triển khai INotifyPropertyChanged. Tuy nhiên, đây sẽ là một ràng buộc dữ liệu một lần.

Ví dụ trong XAML:

<TextBlock Name="SomeTextBlock" Text="{Binding Path=SomeProp}" /> 

Trong Mã số:

public string SomeProp { get; set; } 
    public MainWindow() 
    { 
     InitializeComponent(); 
     SomeProp = "Test Test Test"; 
     SomeTextBlock.DataContext = this;   
    } 
Các vấn đề liên quan