2016-10-14 2 views
0

Ich mache ein benutzerdefiniertes Steuerelement basierend auf einer Schaltfläche, und ich möchte die Breite der Schaltfläche an eine Eigenschaft der Klasse binden. Ich habe this, this und this betrachtet, aber sie sind entweder nicht das, wonach ich suche, oder nicht funktionieren.Binden Sie eine Eigenschaft an eine andere Eigenschaft eines benutzerdefinierten Steuerelements

generic.xaml

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:CustomControl"> 

<Style TargetType="{x:Type local:MyCustomControl}" BasedOn = "{StaticResource {x:Type Button}}"> 
    <Setter Property = "Background" Value = "LightSalmon" /> 
    <Setter Property = "Foreground" Value = "Blue"/> 
    <Setter Property = "Height" Value = "50"/> 
    <Setter Property = "Width" Value = "{Binding MyCustomControl.TextBinding}"/> 
    <Setter Property = "VerticalAlignment" Value = "Top"/> 
    <Setter Property = "Margin" Value="10"/> 
</Style> 

</ResourceDictionary> 

MyCustomControl.cs

namespace CustomControl 
{ 
public class MyCustomControl : Button 
{ 
    double m_textBinding = 50; 
    public double TextBinding 
    { 
     get { return m_textBinding; } 
     set { m_textBinding = value; } 
    } 
    static MyCustomControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), 
      new FrameworkPropertyMetadata(typeof(MyCustomControl))); 
    } 
} 
} 

Wenn es sein muss, kann ich nur den "Setter" -Funktion, und geben Sie manuell, "Width = value;", aber ich würde es vorziehen, zu verwenden, eine Bindung. Derzeit funktioniert die "{Binding MyCustomControl.TextBinding}" nicht.

+0

'TextBinding' scheint ein seltsamer Name für eine Eigenschaft zu sein, die die Breite eines Steuer definiert. – Clemens

+0

Ya, ich erkannte, dass es ein Doppel ist, keine Schnur, und ich behielt nur den Namen, weil ich faul bin, und das ist nur ein Test. –

Antwort

1

sollte diese Arbeit:

<Setter Property="Width" 
     Value="{Binding TextBinding, RelativeSource={RelativeSource Self}}"/> 
+0

Ok, das hat irgendwie funktioniert. Es nimmt den Anfangswert von 50 in Ordnung, aber wenn ich mein Steuerelement verwende, dann im MainWindow-Codebehind, wenn ich sage "myControl.TextBinding = 100;" passiert nichts –

+0

Das ist, weil Ihre Eigenschaft nicht über eine Wertänderung benachrichtigt . Entweder Sie machen es zu einer Abhängigkeitseigenschaft oder Sie implementieren die INotifyPropertyChanged-Schnittstelle. Abhängigkeitseigenschaft wäre in einem UI-Steuerelement vorzuziehen. – Clemens

+0

Ah, richtig, danke. Ich musste vergessen, dass ich das tun musste. Ich habe eine Dependency-Eigenschaft erstellt und sie funktioniert fast perfekt. Müssen Sie einfach seinen Fallbackvalue jetzt arbeiten lassen. Nochmals, vielen Dank! –

Verwandte Themen