2015-02-03 21 views
5

Quindi sono davvero confuso qui.DataGrid SelectedItem non si aggiorna

Ho creato un datagrid, ho associato i suoi elementi all'origine in due modi e legato l'elemento selezionato in due direzioni. L'elemento selezionato viene chiamato getter ma il setter non lo fa mai. Tutti i pezzi sembrano essere qui. Cosa mi manca?

<DataGrid ItemsSource="{Binding Properties ,Mode=TwoWay}" 
        SelectedItem="{Binding SelectedProperty ,Mode=TwoWay}" 
        CanUserDeleteRows="False" CanUserAddRows="False" AutoGenerateColumns="False" Background="LightBlue"> 

    <DataGrid.Columns> 
     <DataGridTextColumn IsReadOnly="True" Header="Address" Binding="{Binding Address}"/> 
    </DataGrid.Columns> 
    <DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <DataGrid ItemsSource="{Binding Units ,Mode=TwoWay}" 
        SelectedItem="{Binding SelectedUnit, Mode=TwoWay}" 
        CanUserDeleteRows="False" CanUserAddRows="False" AutoGenerateColumns="False"> 

Il mio primo datagrid funziona bene compreso l'elemento selezionato.

La seconda terza e la quarta griglia annidata tuttavia non si collegano all'elemento selezionato. Le origini degli articoli funzionano ma è

public class PropertyModel : ModelBase 
    { 
    private ObservableCollection<UnitModel> _Units; 

    public ObservableCollection<UnitModel> Units 
    { 
     get { return _Units; } 
     set { _Units = value; } 
    } 
    private UnitModel _SelectedUnit; 

    public UnitModel SelectedUnit 
    { 
     get { return _SelectedUnit; } 
     set { _SelectedUnit = value; OnPropertyChanged("SelectedUnit"); } 
    } 

Non ci sono errori di espressione di associazione o altri errori visualizzati nella finestra di output.

+1

ho aggirato il problema con l'utilizzo di due 'ItemsControl' per la mia rete e un po ' per 'RowHeader' e' ColumnHeader'. Sarei ancora incantato se c'è un modo per farlo con un 'DataGrid' – MadddinTribleD

risposta

5

La risposta a questo è abbastanza ovvio in realtà.

ho dimenticato di mettere UpdateSourceTrigger = PropertyChanged

quindi dovrebbe assomigliare a questo

<DataGrid ItemsSource="{Binding Units ,Mode=TwoWay}" 
     SelectedItem="{Binding SelectedUnit,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
     CanUserDeleteRows="False" CanUserAddRows="False" AutoGenerateColumns="False"> 

Questo ha risolto il problema

+1

Grazie, sono rimasto bloccato su questo per due giorni. – Guge

1

ho di fronte qualcosa di simile a quello di un paio di mesi fa, per qualche motivo il interno DataGridItemSource non è stato impostato correttamente utilizzando in questo modo, sono riuscito a risolvere il problema che legandosi con ElementName per impostare la RowDetail DataGridItemSource al SelectedItem in parent:

<DataGrid x:Name="DataGrid" ItemsSource="{Binding Properties ,Mode=TwoWay}" 
        SelectedItem="{Binding SelectedProperty ,Mode=TwoWay}" 
        CanUserDeleteRows="False" CanUserAddRows="False" AutoGenerateColumns="False" Background="LightBlue"> 

    <DataGrid.Columns> 
     <DataGridTextColumn IsReadOnly="True" Header="Address" Binding="{Binding Address}"/> 
    </DataGrid.Columns> 
    <DataGrid.RowDetailsTemplate> 
    <DataTemplate> 
     <DataGrid ItemsSource="{Binding SelectedItem.Units ,Mode=TwoWay,ElementName=DataGrid}" 
+1

qui quello che ti ho detto su http://stackoverflow.com/questions/27131113/rowdetailstemplate-itemsource-binded-to-an-ef-navigationproperty – Usama

+2

Quindi questa soluzione non funzionerà ed ecco perché. Il problema non è che l'origine degli elementi non sia popolata. Funziona bene Il problema è che la proprietà a cui è associato l'elemento selezionato per la griglia nidificata non è impostata. Ho testato la tua soluzione, incluso l'aggiunta di SelectedItem = {Binding ElementName = PropertiesGrid, Path = SelectedItem, Mode = TwoWay "} Chiaramente se faccio questo potrebbe impostare l'elemento selezionato corretto ma distrugge qualsiasi tentativo di vincolarlo. else –

Problemi correlati