2014-03-03 76 views
0

我需要一個自定義控件(CC),CC中的文本框的Text屬性可以綁定到CC上的DependancyProperty。將Textbox.Text綁定到自定義控件DP

我也嘗試將textbox.text與templatebinding綁定。

我嘗試了幾乎所有我能想到的事情,該怎麼辦? :

自定義控制在泛型:

<Style TargetType="{x:Type local:TextboxCC}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:TextboxCC}"> 
        <Border Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}"> 
         <TextBox Text="{Binding NText, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:TextboxCC}}}" /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

CC.cs

public class TextboxCC : Control 
{ 
    public string NText 
    { 
     get { return (string)GetValue(NTextProperty); } 
     set { SetValue(NTextProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for NText. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty NTextProperty = 
     DependencyProperty.Register("NText", typeof(string), typeof(TextboxCC), new PropertyMetadata(null)); 

    static TextboxCC() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(TextboxCC), new FrameworkPropertyMetadata(typeof(TextboxCC))); 
    } 
} 

主窗口:

標籤是隻是爲了檢查,如果該值在Mainwindow.Test

改變
<local:TextboxCC NText="{Binding Test,Mode=TwoWay}" HorizontalAlignment="Left" Margin="115,99,0,0" VerticalAlignment="Top" Width="206"/> 
    <Label Content="{Binding Test,Mode=TwoWay}" HorizontalAlignment="Left" Margin="115,161,0,0" VerticalAlignment="Top" Width="206"/> 

個Mainwindow.cs

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private string _test; 

    public string Test 
    { 
     get { return _test; } 
     set 
     { 
      _test = value; 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs("Test")); 
     } 
    } 

    public MainWindow() 
    { 
     InitializeComponent();this.DataContext = this; 

    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 
+0

你在設置DataContext嗎? – safetyOtter

+0

是的,我在設計中做到了,但現在我在代碼中添加了它。 –

+1

你的問題到底是什麼?你的代碼適合我。您是否需要在CC TextBox中的每個關鍵筆畫上更新綁定? – Clemens

回答

3

默認情況下,僅當控件失去焦點時,纔會更新TextBox的Text屬性上的綁定(在源方向上)。如果你想讓它每次文字的變化,可以設置綁定的UpdateSourceTrigger屬性更新爲PropertyChanged

<TextBox Text="{Binding NText, 
    RelativeSource={RelativeSource FindAncestor, AncestorType=local:TextboxCC}, 
    UpdateSourceTrigger=PropertyChanged}" /> 
+0

謝謝這工作得很好 –

0

你需要實現這樣的事情:

void ExtendedCheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     if (!chk_IsChanging) 
      this.IsCheckedReal = "X";      

    } 

    public string IsCheckedReal 
    { 
     get { return (string)GetValue(IsCheckedRealProperty); } 
     set 
     { 
      SetValue(IsCheckedRealProperty, value); 
     } 
    } 

    public static readonly DependencyProperty IsCheckedRealProperty = 
     DependencyProperty.Register("IsCheckedReal", typeof(string), typeof(ExtendedCheckBox), new PropertyMetadata(IsCheckedRealChanged)); 

    private static void IsCheckedRealChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 

     if (e.NewValue.Equals("X") || e.NewValue.Equals("Y")) 
     { 
      ((ExtendedCheckBox)o).IsChecked = true; 
     } 
     else if (e.NewValue.Equals("") || e.NewValue.Equals("N")) 
     { 
      ((ExtendedCheckBox)o).IsChecked = false; 
     } 


    } 

我想,關於複選框的檢查,我想在我的模型性質的「X」標誌的行爲。

所以我創建了一個依賴屬性IsCheckedRealProperty,我將結合這樣的:

chk.SetBinding(ExtendedCheckBox.IsCheckedRealProperty, binding); 

希望這有助於。

0

更改您的依賴屬性此,你的代碼的執行將工作,因爲它是。該文本框在失去焦點時進行更新。

public static readonly DependencyProperty NTextProperty = DependencyProperty.Register(
     "NText", typeof (string), typeof (TextboxCC), new PropertyMetadata(default(string))); 

    public string NText 
    { 
     get { return (string) GetValue(NTextProperty); } 
     set { SetValue(NTextProperty, value); } 
    } 
+1

'默認(字符串)'是'null'。因此,你的代碼和問題中的代碼一樣。 – Clemens

+0

是的,我的錯誤,我在嘗試這段代碼時被一個錯誤所迷惑,並用ReSharper重新創建了依賴項屬性。 –

相關問題