2014-02-26 31 views
0

我有一個用戶控件的UserControl有一個DependencyProperty這臺在代碼隱藏(我想這可能是我的問題的根源,但還是不知道該怎麼做):綁定從DependencyProperty的工作不

用戶控件

public partial class MyControl 
{ 
    public MyControl() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyControl), 
     new FrameworkPropertyMetadata("",FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(TextProperty, value); InvokePropertyChanged(new PropertyChangedEventArgs("Text"));} 
    } 

    public static string GetText(DependencyObject obj) 
    { 
     return (string)obj.GetValue(TextProperty); 
    } 

    public static void SetText(DependencyObject obj, string value) 
    { 
     obj.SetValue(TextProperty, value); 
    } 

    private void ChangeText() 
    { 
     Text="some value"; 
    } 
} 

在我View.xaml我用這個控制這樣的:

<MyControl Text="{Binding Text, RelativeSource={RelativeSource Self}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/> 

而在我的ViewModel的Text屬性:

private string _text; 
    public string Text 
    { 
     get { return _text; } 
     set { _text= value; InvokePropertyChanged(new PropertyChangedEventArgs("Text"));} 
    } 

的問題:在視圖模型 Text屬性永遠不會被更新;當使用像TextBox這樣的常規控件進行綁定時,所有工作都是完美的;如果我在XAML中設置文本,UserControl更新的文本。 我做錯了什麼?


UPDATE 我的問題是,我已經在MyControl設置的DataContext明確。

回答

3

問題是在你的綁定:

Text="{Binding Text, RelativeSource={RelativeSource Self}, 
       UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 

Text財產是在你的視圖模型,但你通過使用RealtiveSource重新指向自我參照本身。所以,它將Text DP與自身綁定在一起。

如果您已經設置了DataContext您的控件,它將自動從父項繼承DataContext。所以,你根本不需要RelativeSource

它只應該是:

Text="{Binding Text}" 

幾個點以上(但不涉及您的問題)

  • 因爲你的目標,從控制範圍內使用此屬性,所以去普通DP而不是附屬性。

  • 由於在註冊時,您已將其設置爲默認綁定TwoWay。無需在綁定時明確地做到這一點。

  • 從您的DP包裝設置器中刪除InvokePropertyChanged調用。 Setter不會從XAML調用,而且DP已經知道了PropertyChanged。


UPDATE

在箱子MyControlDataContext被設置爲另一個類的實例,上述方法將搜索MyControl的DataContext Text屬性。

您可以通過父控件的DataContext(StackPanel中你的情況)是這樣的:

Text="{Binding DataContext.Text, RelativeSource={RelativeSource 
           Mode=FindAncestor, AncestorType=StackPanel}}" 
+0

這不工作太...... :(當我通過調用ChangeText()更改MyControl中的屬性時,它不會更改ViewModel的Text屬性 – lena

+0

非常感謝您的筆記,儘管 – lena

+0

您確定已將DataContext設置爲指向ViewModel在你的包含控制MyControl(可能是窗口,另一個用戶控件等)。還有沒有你明確地設置DataContext MyControl?你能在輸出窗口中尋找任何綁定錯誤嗎?ViewModel中的Text屬性getter被擊中上負載? –

1

你已經註冊你的財產作爲附加,但你也使用它作爲一個常規的DependencyProperty。我認爲xaml解析器會感到困惑。決定你想使用哪一個。

+0

附加屬性被註冊對MyControl只有這樣它可以像OP是幹什麼用。 –

+0

嘗試只是「註冊()」,仍然沒有效果... – lena

+0

註冊無論如何是正確的方式來聲明它。 – Dtex

相關問題