2015-06-18 16 views
7

Sto tentando di associare una proprietà che si trova all'esterno di un controllo item. Tuttavia non sembra funzionare.Associazione di una proprietà esterna a un controllo item in XAML

Sembra che in ItemsControl, DataTemplate si riferisca a ciò che è all'interno della raccolta e non al di fuori di esso. Ho provato con RelativeResource e Riferito a AncestorType per ViewModel.

Codice (VM):

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

XAML (Visualizza):

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

Potete controllare il mio esempio su come definire le vostre proprietà? Potrebbe essere utile. –

risposta

8

hai bisogno di impegnare al DataContext del genitore ItemsControl.

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

hmm buon punto, ma ho ancora un errore. Ma ora dice: Impossibile risolvere la proprietà '...' nel contesto dati di tipo 'System.Windows.Controls.ItemsControl' nooooo :( –

+0

Il mio male, ho modificato il codice, per favore riprova. –

+0

sembra che io ancora Ho lo stesso problema, sto usando caliburn MVVM (scusate, ho dimenticato di menzionare anche questo) –

3

ho fatto un esempio veloce e completa su questo:

<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> 

Il contesto per ogni riga è impostato su ciascun oggetto dall'elenco legato. Nel nostro caso, a ogni istanza di modello dalla raccolta di articoli.

Per tornare al DataContext del genitore questa sintassi viene utilizzata:

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

Ecco il codebehind:

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; 
    } 
} 

È possibile definire la proprietà di dipendenza nel vostro ViewModel.

E qui è la mia semplice Modello:

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 { }; 
} 

Di conseguenza, è possibile accedere alla proprietà definita sul DataContext del vostro genitore.

enter image description here

+0

Grazie fratello. Ha aiutato –