2010-08-03 229 views
3

我有一個自定義控件創建的實例在我的視圖中,在我的自定義控件(一個文本框)我有一個依賴項屬性設置綁定到文本值,這一切正常工作和更新。不過,我現在想要將我的視圖的依賴項屬性綁定到我的控件的依賴項屬性,但我無法將其完成。繼承人我的意思Silverlight綁定到自定義控件中的依賴屬性

控制選位

<TextBox x:Name="txtBox" 
        GotFocus="txtBox_GotFocus" 
        LostFocus="txtBox_LostFocus" 
        Grid.Row="0" 
        Text="{Binding TextValueProperty, Mode=TwoWay}"/> 

public DependencyProperty TextValueProperty{ get; set; } 

public int TextValue 
     { 
      get { return (int)GetValue(TextValueProperty); } 
      set 
      { 
       if ((value >= MinValue) && (value <= MaxValue)) 
       { 
        SetValue(TextValueProperty, value); 
       } 
      } 
     } 
    public CustomControl() 
    { 
     TextValueProperty = DependencyProperty.Register("TextValueProperty ", typeof(int), typeof(CustomControl), new PropertyMetadata(null)); 
    } 

查看所選位

<my:CustomControl x:Name="TxtBoxInt" Grid.RowSpan="2" Grid.Row="0" Grid.Column="1"/> 

我想這樣做:

<my:CustomControlx:Name="TxtBoxInt" TextValueProperty="{Binding DestinationProperty}" Grid.RowSpan="2" Grid.Row="0" Grid.Column="1"/> 

和代碼視圖

public DependencyProperty DestionationProperty; 


     public int Destination 
     { 
      get 
      { 
       return (int)GetValue(DestionationProperty); 
      } 
      set 
      { 
       SetValue(DestionationProperty, value); 
      } 
     } 

     public CustomControl() 
     { 
      DestionationProperty = DependencyProperty.Register("DestionationProperty", typeof(int), typeof(CustomControl), null);    
      InitializeComponent(); 
     } 

那麼我需要做什麼才能綁定我的int值目的地在我的視圖中具有與我的自定義控件的TextValue相同的值?謝謝:)

PS喜灰

+0

+1這是一個很好的問題,它顯示了很多誤解和陷阱。可能需要一些時間才能提供完整的答案。關於需求的問題,您正試圖創建一個只允許輸入數字的控件,並且必須限制爲最小/範圍?您無法在SDK或Silverlight Toolkit中找到控件,例如設計'NumericUpDown'控件的樣式? – AnthonyWJones 2010-08-03 14:15:45

+0

這是非常有限的版本,它奠定了與該字段的值的簡單綁定的基礎。更多的功能最終將被要求,但我也可能在做其他控制時遇到同樣的問題,所以最好先解決這個問題。我相信什麼即時丟失是一些財產提出的東西,我沒有任何運氣實施工作 – lee 2010-08-03 15:45:10

回答

1

右傾哦,其實我已經整理,現在這個問題併爲他人謀取利益,我會嘗試,並記下我是如何做到無我的代碼盡我所能在眼前我。

好吧,首先我的自定義控件,我沒有正確使用依賴屬性(哈哈)開始。因此,我們先糾正一下。

public partial class CustomControl : UserControl 
    { 
     public DependencyProperty FieldValueProperty { get; set; } 

     public CustomControlViewModel Context = new CustomControlViewModel(); 

     public int FieldValue 
     { 
      get { return (int) GetValue(FieldValueProperty); } 
      set 
      { 
       SetValue(FieldValueProperty,value); 
      } 
     } 

     public CustomControl() 
     { 
      this.DataContext = Context; 
      FieldValueProperty = DependencyProperty.Register("FieldValue", typeof (int), typeof (CustomControl), 
                  new PropertyMetadata(FieldValueChanged)); 
      InitializeComponent(); 

     } 

     void FieldValueChanged(Object sender, DependencyPropertyChangedEventArgs e) 
     { 
      Context.FieldValue = (int)e.NewValue; 
     } 
    } 

    public class CustomControlViewModel : BaseClass 
    { 
     private int _fieldValue; 

     public int FieldValue 
     { 
      get { return _fieldValue; } 
      set 
     { 
      _fieldValue = value; 
      RaisePropertyChanged("FieldValue"); 
     } 
     } 
    } 

不少有變化,認爲它最好的辦法就是看公衆fieldValue方法多數民衆贊成它使用的GetValue和的SetValue簡單地爲你所依賴的屬性方法CustomControl的一部分,當您使用的SetValue它使用依賴項屬性,當值更改時,依賴項屬性會調用您指定它在DependencyProperty.Register元數據中調用的FieldValueChanged方法。處理被更改的FieldValue的這個方法然後在CustomControlViewModel中設置FieldValue,這個public int設置爲我們訪問的私有值來返回字段值,但是如您注意到的那樣,也調用RaisePropertyChanged(「FieldValue」)方法。現在這個方法是從我的BaseClass繼承的,它實現了這個方法,它基本上實現了INotifyPropertyChanged的東西。所以現在當我的值基本上改變一個事件被推動,現在我所需要做的就是在我的視圖中處理包含此控件的事件。此位是在Constuctor

CustomControlInstance.Context.PropertyChanged += FieldValueChanged(Object Sender, PropertyChangedEventArgs e); 

然後一個簡單的位應該是一個方法只是

void FieldValueChanged(Object Sender, PropertyChangedEventsArgs e) 
{ 
    this.FieldValue = (int)e.NewValue; 
} 

那然後更新我爲與fieldValue從控制角度的fieldValue方法,多數民衆贊成在它得到了一些漏洞但其最好的我可以記住/解釋給你,希望這有助於人們,我當然明白依賴屬性現在好多了:)

我會接受這個答案作爲接受的答案,當我回到電腦上明天

+0

這種方法的工作,但不是我想要的更新與正確的方式做到這一點與依賴性屬性,當我得到時間 – lee 2010-08-09 11:05:19

相關問題