2015-10-29 3 views
6

Verwendung:XAML: Wie kann ich eine DependencyProperty an eine C# -Eigenschaft desselben Namens für ein anderes Objekt binden?

  • Visual Studio Community Edition 2015
  • .Net 4,0

Ich habe this answer umgesetzt, meine eigene CheckBox Klasse produzieren komplett mit einem IsCheckedDependencyProperty. Diese Eigenschaft wird durch die IsChecked Eigenschaft auf dem WPF CheckBox unterstützt, oder wäre, wenn es funktionieren würde. Arbeiten würde bedeuten, dass mein Getter und Setter aufgerufen werden, wenn das Kontrollkästchen umgeschaltet wird.

Wenn ich meine Eigenschaft in IsChecked_temp umbenenne und das XAML so modifiziere, dass es passt, funktioniert es gut. Ich denke, das ist ein Namenskonflikt, aber warum löst ElementName es nicht? Mein minimaler Testfall folgt.

EDIT 0: Ich habe vergessen zu erwähnen, ich bekomme keine Fehler oder Warnungen.

EDIT 1: This answer wurde zunächst akzeptiert, weil es für den Testfall funktioniert, aber es ist anscheinend nicht die gesamte Antwort. Anwendung auf mein Projekt (und Umbenennung der CheckBox Klasse ToggleBox) ergibt eine XamlParseException bei jeder Nutzung der Immobilie:

A ‚Bindung‘ kann auf der ‚IsChecked‘ Eigenschaft des Typs ‚ToggleBox‘ nicht eingestellt werden. Eine 'Bindung' kann nur für eine DependencyProperty eines DependencyObject festgelegt werden.

Ich werde versuchen, einen minimalen Testfall zu bekommen, um dies zu zeigen.

CheckBox.xaml

<UserControl x:Class="CheckBox_test.CheckBox" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      x:Name="Self"> 
    <StackPanel> 
     <CheckBox IsChecked="{Binding IsChecked, ElementName=Self}" /> 
    </StackPanel> 
</UserControl> 

CheckBox.xaml.cs

using System.Windows; 
using System.Windows.Controls; 

namespace CheckBox_test 
{ 
    public partial class CheckBox : UserControl 
    { 
     public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
      "IsChecked", 
      typeof(bool), 
      typeof(CheckBox), 
      new FrameworkPropertyMetadata(false, 
        FrameworkPropertyMetadataOptions.AffectsRender)); 

     public bool IsChecked 
     { 
      get { return (bool)GetValue(IsCheckedProperty); } 
      set { SetValue(IsCheckedProperty, value); } 
     } 

     public CheckBox() 
     { 
      InitializeComponent(); 
     } 
    } 
} 

MainWindow.xaml

<Window x:Class="CheckBox_test.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:CheckBox_test"> 
    <Grid> 
     <local:CheckBox /> 
    </Grid> 
</Window> 

MainWindow.xaml.cs (auf Vollständigkeit)

using System.Windows; 

namespace CheckBox_test 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
+1

Just for Test, versuchen IsChecked = "{Binding Path = IsChecked, Elementname = Selbst}" – Spawn

+1

@Spawn zu schreiben Ich habe das mit und ohne '_temp' probiert und die gleichen Ergebnisse erhalten. Einen Versuch wert, aber danke. – Grault

+0

Ok, ich werde es morgen versuchen ... Selbst ist kein so seltener Name für UserControl, also muss es funktionieren. Können Sie sagen, welche Visual Studio- und .NET-Version Sie verwenden? – Spawn

Antwort

1

Sehr interessante Frage (zumindest für mich) so es stellt sich heraus, dass es wirklich ein Konflikt von Namen, wenn Sie Ihre Abhängigkeitseigenschaft registrieren.

Ich bin mir nicht ganz sicher, ob das eine Antwort ist, aber ich denke, du wirst das interessant finden, wenn du vorher nicht davon gewusst oder gedacht hast.

Ich habe "CheckBox.IsChecked" verwendet, aber jeder eindeutige Name würde wahrscheinlich ausreichen.

public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register(
     "CheckBox.IsChecked", 
     typeof(bool), 
     typeof(CheckBox), 
     new FrameworkPropertyMetadata(false, 
       FrameworkPropertyMetadataOptions.AffectsRender)); 

Dies ohne Änderung des Namens Ihrer Immobilie arbeitet

public bool IsChecked 
{ 
    get 
    { 
     return (bool)GetValue(IsCheckedProperty); 
    } 
    set 
    { 
     SetValue(IsCheckedProperty, value); 
    } 
} 

Wenn Sie Namen für Ihre Abhängigkeitseigenschaften zu erstellen, müssen Sie eindeutige Namen wählen, die Abhängigkeit für nicht-Eigenschaften verwendet werden oder Ereignisse in beliebigen Basisklassen, von denen Sie erben; Andernfalls wird während der Laufzeit eine ArgumentException ausgelöst. Weitere Informationen zu Abhängigkeitseigenschaften und Aktivitätsbindung finden Sie unter Benutzerdefinierte Aktivität Beispiel für eine Beispielbindung und einfache Aktivität.

https://msdn.microsoft.com/en-us/library/vstudio/ms734499(v=vs.90).aspx

Noch eine weitere Erinnerung daran, wie groß ein Noob Ich bin :)

+0

Huh. Ich bekomme keine ArgumentException, aber lemme weg und versuche das ... – Grault

+0

Das löst mein Problem, obwohl ich anscheinend nicht die Kriterien erfülle, dass der widersprüchliche Name "für Abhängigkeitseigenschaften oder Ereignisse in irgendeiner Basis verwendet wird Klassen, von denen Sie erben. " Kudos für diesen Fund. – Grault

+0

Ja, es hat einfach nicht mit allen Binding-Typen funktioniert, die ich ausprobiert habe, ohne den Namen zu ändern oder die Eigenschaft zu einer normalen anstatt der Abhängigkeit zu machen ... Das Material ist von .net 3.5 und hat keine neuere Version (zumindest habe ich keine gefunden) also vielleicht gibt es Veränderungen ... – kirotab

Verwandte Themen