2012-10-15 4 views
5

ich den folgenden Code haben:Kann ich binden gegen eine Dynamic in WinRT/Windows 8 Store Apps

public class MyClass: DynamicObject, INotifyPropertyChanged 
    { 
    Dictionary<string, object> properties = new Dictionary<string, object>(); 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     if (properties.ContainsKey(binder.Name)) 
     { 
      result = properties[binder.Name]; 
      return true; 
     } 
     else 
     { 
      result = "Invalid Property!"; 
      return false; 
     } 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     properties[binder.Name] = value; 
     this.OnPropertyChanged(binder.Name); 
     return true; 
    } 

    public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
    { 
     dynamic method = properties[binder.Name]; 
     result = method(args[0].ToString(), args[1].ToString()); 
     return true; 
    } 

    ///.... Rest of the class. 
    } 

Wenn ich dagegen binden von XAML, Debug-Punkte in TryGetMember nicht triggeret. Vermisse ich etwas?

<DataTemplate x:Key="SearchResults"> 
    <Grid Width="294" Margin="6"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Border Background="{StaticResource ListViewItemPlaceholderBackgroundThemeBrush}" Margin="0,0,0,10" Width="40" Height="40"> 
      <Image Source="{Binding Path=Banner}" Stretch="UniformToFill"/> 
     </Border> 
     <StackPanel Grid.Column="1" Margin="10,-10,0,0"> 
      <TextBlock Text="{Binding SeriesName}" Style="{StaticResource BodyTextStyle}" TextWrapping="NoWrap"/> 
      <TextBlock Text="{Binding Subtitle}" Style="{StaticResource BodyTextStyle}" Foreground="{StaticResource ApplicationSecondaryForegroundThemeBrush}" TextWrapping="NoWrap"/> 
      <TextBlock Text="{Binding Overview}" Style="{StaticResource BodyTextStyle}" Foreground="{StaticResource ApplicationSecondaryForegroundThemeBrush}" TextWrapping="NoWrap"/> 
     </StackPanel> 
    </Grid> 
</DataTemplate> 

Die Datacontext ist auf

public ObservableCollection<dynamic> SearchResults {get;set;} 

und

ICollection col = item.SearchResults;  
this.DefaultViewModel["Results"] = col; //this is the datacontext of the gridview 
+0

Ich wette, dass die Bindung nicht korrekt ist. Zeigen Sie auch eine XAML-Bindung .... – sll

+0

Aktualisiert, um die Bindungen zu enthalten –

+0

Ich enthielt eine normale Eigenschaft: public string SeriesName {get {return _name; } set {SetProperty (ref_name, value); }} und es ist korrekt gebunden. –

Antwort

0

Hier ist eine Lösung, die ich für Art-of verwenden, dynamische Bindung. Die Bindung Syntax muss nur enthalten []:

public class DynamicLocalSettings : BindableBase 
{ 
    public object this[string name] 
    { 
     get 
     { 
      if (ApplicationData.Current.LocalSettings.Values.ContainsKey(name)) 
       return ApplicationData.Current.LocalSettings.Values[name]; 
      return null; 
     } 
     set 
     { 
      ApplicationData.Current.LocalSettings.Values[name] = value; 
      OnPropertyChanged(name); 
     } 
    } 
} 
+0

Wie verweisen Sie auf den Eigenschaftsnamen in XAML? 'Text =" {Binding Path = [PropertyName]} "' funktioniert nicht (hängt Designer). Und das Angeben von Anführungszeichen funktioniert auch nicht ('Text =" {Binding Path = ["PropertyName"]} "'). – tig

+0

Ich bin nicht an meinem Computer, also kann ich es nicht versuchen, aber haben Sie versucht, das Beispiel in der Frage –

+0

zu folgen. Das Aufhängen des Designers war etwas anderes. 'Path = [PropertyName]' funktioniert. – tig

Verwandte Themen