2016-07-13 23 views
0

ich einen Benutzerkontrolle in wpf „GoogleMap.xaml/.cs“, wo die XAML-Deklaration beginnt wie folgt benannt haben:WPF: Bindungseigenschaft einer Klasse Abhängigkeit, die ein Benutzersteuerbasisklasse erbt

<controls:BaseUserControl x:Class="CompanyNamespace.Controls.GoogleMap" 

der Code hinter:

public partial class GoogleMap : BaseUserControl{ 

     public static readonly DependencyProperty MapCenterProperty = 
      DependencyProperty.Register("MapCenter", typeof(string), typeof(GoogleMap), new FrameworkPropertyMetadata(string.Empty, OnMapCenterPropertyChanged)); 

    public string MapCenter { 
     get { return (string)GetValue(MapCenterProperty); } 
     set { SetValue(MapCenterProperty, value); } 
    } 

    private static void OnMapCenterPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e){ 
     GoogleMap control = source as GoogleMap; 
     control.SetCenter(e.NewValue.ToString()); 
    } 
... 
} 

Was die korrekte Syntax für mich die Eigenschaft von GoogleMap.xaml ansprechen zu können:

MapCenter="{Binding Location}" 

Ich kann nur von GoogleMap.xaml aus an diese Eigenschaft binden, wenn ich die Eigenschaft in die BaseUserControl-Klasse platziere.

aktualisieren GoogleMapViewModel.cs

public class GoogleMapViewModel : ContainerViewModel{ 


    private string location; 
    [XmlAttribute("location")] 
    public string Location { 
     get { 
      if (string.IsNullOrEmpty(location)) 
       return appContext.DeviceGeolocation.Location(); 

      return ExpressionEvaluator.Evaluate(location); 
     } 
     set { 
      if (location == value) 
       return; 

      location = value; 
      RaisePropertyChanged("Location"); 
     } 
    } 
+1

Da Sie von der Basisklasse erben es sollte keine Rolle spielen, wo Sie die Eigenschaft setzen. Wie sieht dein 'DataContext' aus? –

+0

Ich denke, es wäre besser, ein benutzerdefiniertes Steuerelement zu erstellen und sein Erscheinungsbild in einer 'ControlTemplate' zu ​​definieren. –

+0

hat die VM dort hinzugefügt – jchristof

Antwort

1

Um eine Usercontrol-Eigenschaft in seinem eigenen XAML zu binden, können Sie eine Art erklären könnte:

local ist natürlich
<controls:BaseUserControl 
    x:Class="CompanyNamespace.Controls.GoogleMap" 
    xmlns:local="clr-namespace:CompanyNamespace.Controls" 
    ...> 
    <controls:BaseUserControl.Style> 
     <Style> 
      <Setter Property="local:GoogleMap.MapCenter" Value="{Binding Location}" /> 
     </Style> 
    </controls:BaseUserControl.Style> 
    ... 
</controls:BaseUserControl> 

Der XML-Namespace redundant, wenn es mit controls identisch ist.


Sie könnten wie die Bindung im Konstruktor des Usercontrol als auch erstellen:

public GoogleMap() 
{ 
    InitializeComponent(); 
    SetBinding(MapCenterProperty, new Binding("Location")); 
}