2015-06-18 3 views
7

Ich versuche, eine Eigenschaft zu binden, die sich außerhalb eines Itemscontrols befindet. Das scheint jedoch nicht zu funktionieren.Eine Eigenschaft binden, die sich außerhalb eines Itemscontrols in XAML befindet

Es scheint, dass in ItemsControl DataTemplate bezieht sich auf das, was innerhalb der Sammlung und nicht außerhalb davon ist. Ich habe mit RelativeResource versucht und auf AncestorType für das ViewModel verwiesen.

-Code (VM):

public class Test { 
    public string GetThis {get{return "123";} set{}} 
    public List<string> IterateProperty {get; set;} 
} 

XAML (View):

<ItemsControl ItemsSource="{Binding Path=IterateProperty}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="I want to bind the string property GetThis!" /> 
+0

Können Sie mein Beispiel auf überprüfen, wie Ihre Eigenschaften definieren? Es könnte hilfreich sein. –

Antwort

8

Sie müssen ItemsControl zum DataContext des Mutter binden.

<ItemsControl ItemsSource="{Binding Path=IterateProperty}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding DataContext.GetThis, 
           RelativeSource={RelativeSource Mode=FindAncestor, 
                   AncestorType={x:Type ItemsControl}}}" /> 
+0

hmm gute Pinpoint, aber ich bekomme immer noch einen Fehler. Aber es heißt jetzt: Kann die Eigenschaft '...' im Datenkontext des Typs 'System.Windows.Controls.ItemsControl' nicht lösen. Nooooo :( –

+0

Mein Fehler, ich habe den Code bearbeitet, bitte versuche es noch einmal. –

+0

es scheint, dass ich immer noch bekomme das selbe Problem. Ich benutze Caliburns MVVM. (Entschuldigung, vergessen zu erwähnen, dass auch) –

3

Ich habe ein schnelles und vollständige Beispiel dazu gemacht:

<Window x:Class="ParentDataContext.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid ItemsSource="{Binding items}" AutoGenerateColumns="False"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <CheckBox IsChecked="{Binding IsChecked}"></CheckBox> 
          <TextBlock Margin="5" 
             Text="{Binding Path=DataContext.TextFromParent,RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> 
         </StackPanel> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

Der Kontext für jede Zeile wird auf jedes Objekt von der gebundenen Liste. In unserem Fall für jede Model-Instanz aus der Artikelsammlung.

Um zu den Eltern Datacontext zurück diese Syntax verwendet wird:

Text="{Binding Path=DataContext.TextFromParent,RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/> 

Hier ist der Code-Behind:

public partial class MainWindow : Window 
{ 
    public string TextFromParent 
    { 
     get { return (string)GetValue(TextFromParentProperty); } 
     set { SetValue(TextFromParentProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for TextFromParent. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TextFromParentProperty = 
     DependencyProperty.Register("TextFromParent", typeof(string), typeof(MainWindow), new PropertyMetadata(string.Empty)); 


    public ObservableCollection<Model> items { get; set; } 
    public MainWindow() 
    { 
     InitializeComponent(); 
     items = new ObservableCollection<Model>(); 
     items.Add(new Model() { IsChecked = true }); 
     items.Add(new Model() { IsChecked = false }); 
     items.Add(new Model() { IsChecked = true }); 
     items.Add(new Model() { IsChecked = false }); 
     TextFromParent = "test"; 
     this.DataContext = this; 
    } 
} 

Sie Ihre Abhängigkeitseigenschaft in Ihrem Ansichtsmodell definieren.

Und hier ist mein einfaches Modell:

public class Model : INotifyPropertyChanged 
{ 
    private bool _IsChecked; 

    public bool IsChecked 
    { 
     get { return _IsChecked; } 
     set 
     { 
      _IsChecked = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("IsChecked")); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
} 

Als Ergebnis können Sie das Hotel auf der übergeordneten Datacontext definiert zugreifen.

enter image description here

+0

Dank Bruder. Es half –