2016-09-13 1 views
0

IchSuche Liste der binded Eigenschaft in einem Depedency Property in WPF C#

<local:SuperControl> 
    <local:SuperControl.SBItem> 
     <MultiBinding StringFormat="{}Name: {0} ({1})"> 
      <Binding Path="Name" /> 
      <Binding Path="ID" /> 
     </MultiBinding> 
    </local:SuperControl.SBItem> 
</local:SuperControl> 

Das Ansichtsmodell Property eine WPF Custom Control mit

public string Name { get; set; } 
public string ID { get; set; } 

Betrachten Sie den Wert für die Eigenschaft

Name = "John"; 
ID = "STK001"; 

Die benutzerdefinierte Steuerung

public class SuperControl : ItemsControl 
{ 
    public static readonly DependencyProperty SBItemProperty = DependencyProperty.Register("SBItem", typeof(string), typeof(BAutoComplete), new PropertyMetadata(null)); 

    public string SBItem 
    { 
     get { return (string)GetValue(SBItemProperty); } 
     set { SetValue(SBItemProperty, value); } 
    } 

    public override void OnApplyTemplate() 
    { 
     string Name = SBItem; 
     string ID = SBItem; 
     string StringFormat = SBItem; 
    } 
} 

Betrachten Sie das Stück Code in der Custom Control

public override void OnApplyTemplate() 
{ 
    string Name = SBItem; 
    string ID = SBItem; 
    string StringFormat = SBItem; 
} 

Hier muss ich die Wert des Binded PropertyName, ID und String Format von der AbhängigkeitseigenschaftSBItem bekommen. Bitte hilf mir.

+0

ich nicht ganz verstehen Sie haben, versuchen Sie 'SBItem' irgendwie explodiert ...? –

+0

@AnnaSB, in der Laufzeit wissen wir nicht, welche Art von String es ist ... Also, ich muss wissen, die Binde Informationen zusammen mit String Format ... –

+2

Ehrlich gesagt macht die Frage keinen Sinn. Sie können keine Abhängigkeitseigenschaft vom Typ string haben, die über ein MultiBinding (das eine Zeichenfolge erzeugt) an ein Ansichtsmodellobjekt gebunden ist und hoffen, auf die einzelnen Eigenschaften der Ansichtsmodellklasse zugreifen zu können. – Clemens

Antwort

1

Sie können Binded-Werte nicht in ApplyTemplate Methode erhalten. Wie es vor dem Binden heißt.

So bieten Sie einen Rückruf für die Änderung der Eigenschaften mit new PropertyMetadata(null,new PropertyChangedCallback(OnPropertyChanged)) in Ihrer DP-Definition.

private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      string value = (string)e.NewValue; 
      string Name = value.Split(new char[] { ':' })[1].Split(new char[] { '(' })[0].Trim(); 
      string ID = value.Split(new char[] { ':' })[1].Split(new char[] { '(' })[1].Split(new char[] { ')' })[0].Trim(); 
      string formatting = BindingOperations.GetMultiBinding(d, MyButton.MyPropertyProperty).StringFormat; 
     } 
+0

'BindingOperations.GetMultiBinding' ist der Schlüssel hier. Nimm die zurückgegebene MultiBinding und iteriere über ihre 'Bindings', um ihren' Pfad' zu überprüfen. – Clemens

+1

Er hat die Frage im Allgemeinen gestellt, aber Ihre Antwort ist spezifisch für die gegebene Zeichenfolge. –

0

Wie AnjumSKhan bereits erwähnt, können Sie eine Changed -Methode für die DependencyProperty umsetzen müssen. Im Folgenden finden Sie einen allgemeineren Ansatz, wie Sie die gebundenen Werte erhalten können.

public static readonly DependencyProperty SBItemProperty = DependencyProperty.Register("SBItem", typeof(string), typeof(BAutoComplete), new PropertyMetadata(Changed)); 

    private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
     MultiBindingExpression mbe = null; 
     try { 
     mbe = BindingOperations.GetMultiBindingExpression(d, e.Property); 
     } catch { } 
     if (mbe != null) { 
     foreach (var beb in mbe.BindingExpressions) { 
      var bindingExpressionBase = (BindingExpression)beb; 
      var di = bindingExpressionBase.DataItem; 
      var p = di.GetType().GetProperty(bindingExpressionBase.ResolvedSourcePropertyName); 
      var val = p.GetValue(di); 
      Console.WriteLine($"Property: {p.Name} Value: {val}"); 
     } 
     } else { 
     try { 
      var binding = BindingOperations.GetBindingExpression(d, e.Property); 
      var di = binding.DataItem; 
      var p = di.GetType().GetProperty(binding.ResolvedSourcePropertyName); 
      var val = p.GetValue(di); 
      Console.WriteLine($"Property: {e.Property.Name} Value: {val}"); 
     } catch { 
      Console.WriteLine("No binding found"); 
     } 
     } 
    } 

Hinweis

Natürlich müssen Sie meine Console.WriteLine mit Ihrem eigenen Logik ersetzen. In diesem Beispiel soll gezeigt werden, wie Sie die Werte aus der gebundenen Quelle beziehen können. Wahrscheinlich können Sie den Teil, den ich als Fallback implementiert habe, ignorieren, wenn es sich bei der Bindung um eine normale und nicht um eine Mehrfachbindung handelt.

Hope this bekommt man in die richtige Richtung

Verwandte Themen