2013-07-30 75 views
3

我有一個問題,我無法創建一個用戶控件,該控件在父對象已將該對象設置爲數據綁定時使用自定義對象的屬性。將UserControl綁定到它自己的dependencyProperty不起作用

嘗試解釋我的意思是這裏的代碼。 自定義對象:

public class MyObj 
{ 
    public string Text { get; set; } 

    public MyObj(string text) 
    { 
     Text = text; 
    } 
} 

用戶控制代碼背後:

/// <summary> 
/// Interaction logic for MyControl.xaml 
/// </summary> 
public partial class MyControl : UserControl 
{ 
    public static readonly DependencyProperty ObjectProperty = 
     DependencyProperty.Register("Object", typeof (MyObj), typeof (MyControl), new PropertyMetadata(default(MyObj))); 

    public MyObj Object 
    { 
     get { return (MyObj) GetValue(ObjectProperty); } 
     set { SetValue(ObjectProperty, value); } 
    } 

    public MyControl() 
    { 
     InitializeComponent(); 
    } 
} 

用戶控制XAML:

<UserControl x:Class="Test.MyControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<TextBlock Text="{Binding Object.Text}"/> 

因此,所有我希望是MyControl顯示與一個TextBlock顯示任何字符串在MyObj.Text中的文本;

如果我在代碼中添加控件,沒有任何綁定,那麼這個工程就可以了。

MyControl myControl = new MyControl(){ Object = new MyObj("Hello World!") }; 
grid.Children.Add(myControl); 

但是,如果我嘗試使用數據綁定這不顯示任何東西,這裏是MainWindow的代碼。

代碼隱藏:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private MyObj _Object; 
    public MyObj Object 
    { 
     get { return _Object; } 
     set 
     { 
      _Object = value; 
      OnPropertyChanged("Object"); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 

     Object = new MyObj("HELLO"); 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

XAML:

任何人都可以點我在正確的方向,我想這是與使用相對源上的用戶控件綁定,但我米不確定。

感謝

回答

14

我個人從來沒有用的相對自上一個用戶控件綁定,所以我不能確定它是否工作。您可以嘗試設置的x:Name,並在綁定中使用它。

<UserControl x:Class="Test.MyControl" 
      ... 
      x:Name="window"> 
    <TextBlock Text="{Binding ElementName=window, Path=Object.Text}"/> 
</UserControl> 

請注意,如果數據綁定在運行時無法綁定,您還應該在「輸出」窗口中看到相關的錯誤消息。

+0

啊完美的,那出色的作品。我從未使用ElementName,然後從現在開始將它提交到內存中。謝謝你 –

+2

Upvote爲「輸出窗口」提示。 – Anthony

-1

它已經很長一段時間..但是因爲有一種新技術我想在這裏發佈。

編譯時間綁定:這是一個與Windows 10引入的新型綁定。此綁定具有很多性能優勢的經典綁定。

和額外的好處,你不需要設置任何的DataContext的頁面或控件本身就是的DataContext可以綁定到頁面或控制

​​

什麼,但完美地做這項工作,你有想象..不!不像你猜測的那樣。 並且有答案。

編譯時綁定的默認設置爲一次性,而不是經典的綁定是本身對於單向

因此您需要明確設置模式爲OneWay以確保該值始終更新。

<UserControl x:Class="Test.MyControl" 
      ... 
      x:Name="window"> 
    <TextBlock Text="{x:Bind Object.Text,Mode=OneWay}"/> 
</UserControl> 
相關問題