2017-02-14 2 views
0

Ich weiß, ich sollte wirklich anfangen, ein Buch über XAML und WPF zu lesen, weil ich denke, dass alle meine Probleme hier zu einem Mangel an Verständnis über Datenbindung gehören (ich habe WinForms seit Jahren verwendet):Wie funktioniert die Datenbindung zwischen ContextMenuItems von DataGridRow und DataGridRow an Eigenschaften in gekapselten Viewmodels?

Meine Anwendung besteht aus einem TreeView und ein DataGrid.

In der TreeView habe ich ViewModels für jeden ParentNode, ChildNode und GrandChildNode hinzugefügt.

Ich habe das Beispiel von Josh Smith found here verwendet.

zu kurz sein, er/I verwendet

<HierarchicalDataTemplate 
        DataType="{x:Type local:ViewModel.TreeViewChildNodeViewModel}" 
        ItemsSource="{Binding Children}"> 
</HierarchicalDataTemplate.Resources> 

childNode zu einem ChildNodeViewModel und zu dem entsprechenden Modell zu binden.

ich als hinzugefügt - im TreeViewChildNodeViewModel Konstruktor:

ContextMenuItems = new List<MenuItem>(); 
ContextMenuItems.Add(new MenuItem() { 
          Header = "Click", 
          Command = _cmdDoSmth 
          ToolTip = new ToolTip() { Content = "blabla" } 
            } 
); 

, die zur Ansicht mit dieser Eigenschaft ausgesetzt:

private readonly List<MenuItem> ContextMenuItems; 
public List<MenuItem> ContextMenu { 
    get { return ContextMenuItems; } 
} 

Beachten Sie, dass ich mehrere Konstrukteure haben. Ich füge verschiedene ContextMenuItems zur ContextMenu-Liste hinzu, abhängig davon, mit welchem ​​Modell ich das ViewModel verwenden möchte. Der "root" ChildNode besteht aus:

<TextBlock 
    Text="{Binding ChildNodeDisplayItem}"> 
    <TextBlock.ContextMenu> 
     <ContextMenu 
      ItemsSource="{Binding ContextMenu}"></ContextMenu> 
    </TextBlock.ContextMenu> 
</TextBlock> 

Das funktioniert wie es sollte. Jetzt beginnen meine Probleme damit, etwas Ähnliches mit dem Datagrid zu machen.

Was ich brauche, zu erreichen ist:

Ich möchte Zeilen zeigen im Datagrid. Jede Reihe hat ihr eigenes Ansichtsmodell mit einer exponierten Liste von ContextMenuItems (sowie natürlich das Modell). Ich möchte in der Lage sein, die Anzahl, den Header und den Befehl jedes Kontextmenüs in Abhängigkeit von dem ausgewählten Ansichtsmodell zu definieren.

Was ich getan habe bisher:

In meinem MainWindow.xaml:

<Controls:MetroWindow.Resources> 
    <ContextMenu x:Key="DataRowContextMenu" ItemsSource="{Binding Path=ActionReactionDataGridViewModel/ContextMenu, RelativeSource={RelativeSource AncestorType=DataGrid, Mode=FindAncestor}}"/> 
</Controls:MetroWindow.Resources> 

<DataGrid 
    AutoGenerateColumns="True" 
    AutoGeneratingColumn="OnAutoGeneratingColumn" 
    HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" 
    BorderThickness="1,1,1,1" 
    Margin="0,0,0,0" 
    ItemsSource="{Binding Path=ActionReactionDataGridViewModel/DataGridSource}" 
    SelectedItem="{Binding Path=ActionReactionDataGridViewModel/SelectedDataGridItem}" 
    BorderBrush="#FF020202"> 
    <DataGrid.RowStyle> 
     <Style TargetType="{x:Type DataGridRow}"> 
      <Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />    </Style> 
    <DataGrid.RowStyle> 
</DataGrid> 

In meinem MainWindowViewModel:

public MainWindowViewModel() // Constructor 
    { 
     actionReactionDataGrid = new ObservableCollection<ActionReactionDataGridViewModel>(); 
     actionReactionDataGrid.Add(new ActionReactionDataGridViewModel()); 

    } 

    private ObservableCollection<ActionReactionDataGridViewModel> actionReactionDataGrid; 
    public ObservableCollection<ActionReactionDataGridViewModel> ActionReactionDataGridViewModel 
    { 
     get { return actionReactionDataGrid; } 
    } 

Mein ActionReactionDataGridViewModel ist hier:

public class ActionReactionDataGridViewModel : ViewModelBase 
{ 
    private readonly List<MenuItem> ContextMenuItems; 

    public ActionReactionDataGridViewModel() 
    { 

     ContextMenuItems = new List<MenuItem>(); 

     ContextMenuItems.Add(new MenuItem() 
          { 
           Header = "blubb" 
          }); 

     dataGridSource = new ObservableCollection<ActionReactionDataGridModel>(); 
     dataGridSource.Add(new ActionReactionDataGridModel("Status","Eventname","Eventtyp","ReaktionName","ReaktionTyp")); 
    } 

    public List<MenuItem> ContextMenu { 
     get { return ContextMenuItems; } 
    } 

    private ActionReactionDataGridModel selectedDataGridItem; 
    public ActionReactionDataGridModel SelectedDataGridItem { 
     get { return selectedDataGridItem; } 
     set {selectedDataGridItem = value; RaisePropertyChanged("SelectedDataGridItem"); } 
    } 

    private ObservableCollection<ActionReactionDataGridModel> dataGridSource; 
    public ObservableCollection<ActionReactionDataGridModel> DataGridSource { 
     get { return dataGridSource; } 
     set { dataGridSource = value; RaisePropertyChanged("DataGridSource"); } 
    } 


} 

ICH Denken Sie daran, den Inhalt des Modells zu veröffentlichen, da es nur die Spaltenüberschriften und einige Beispielzeichenfolgen enthält. Ich denke, was iam fehlt, ist das Wissen, das DataGrid Control in der View in MainWindow.xaml anzuweisen, die itemssource an "DataGridSource" anstatt an "ActionReactionDataGridViewModel" zu binden.

Ich habe andere Beiträge zu SO über das Hinzufügen von Kontextmenüs zu einem Datagridrow gefunden. Was mir fehlte, ist die Fähigkeit, die Anzahl, den Text und den Befehl an jedes Viewmodel zu binden.

Jede Hilfe würde sehr geschätzt werden.

Vielen Dank.

// EDIT 1

Ok. herauszufinden, wie man die Eigenschaft eines Viewmodels aus einer Sammlung von Viewmodels herausgibt, war einfach.

i hinzugefügt

ItemsSource="{Binding Path=ActionReactionDataGridViewModel/DataGridSource} 

Erklärung ist here

Jetzt habe ich "nur" brauche, um herauszufinden, wie die contextmenu Artikel hinzufügen zu jedem Ansichtsmodell ...

Antwort

0
<DataGrid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="HeaderName"> 
        </MenuItem> 
       </ContextMenu> 
      </DataGrid.ContextMenu> 

innen Menü Artikel können Sie Ihre Kontrolle schreiben.

+0

doenst dies dazu führen, dass das Kontextmenü überall im Steuerelement angezeigt wird? Ich möchte, dass es auf "ActionReactionDataGridViewModel.ContextMenu" und auf die gesamte Zeile gesetzt wird. – c3rebro

+0

Irgendwo wo im DataGrid es angezeigt wird –

Verwandte Themen