none
DataGridComboBoxColumn Inhalt gefiltert abhänig von einer Column davor MVVM

    Frage

  • Hallo Zusammen,

    ich hoffe ich erkläre mein Anliegen jetzt nicht zu kompliziert.

    Es gibt 3 Objekte in meiner Testanwendung (Beispielhaft).

    Testobjekt1 besitzt lediglich eine ID und einen Namen.
    Testobjekt2 besitzt eine eigene ID, die "FremdID" von Testobjekt1 zu dem es gehören soll und ebenfalls einen Namen.
    Testobjekt3 besitzt eine eigene ID, die "FremdID" von Testobjekt1, die "FremdID" von Testobjekt2 und ebenfalls einen Namen.

    public class TestObjekt1 : ViewModelBase
        {
            int _testObjekt_1_Id;
            public int TestObjekt_1_Id 
            { get { return _testObjekt_1_Id; } 
            set { _testObjekt_1_Id = value; 
            OnPropertyChanged(); } }
    
            string _testObjekt_1_Name;
            public string TestObjekt_1_Name 
            { get { return _testObjekt_1_Name; } 
            set { _testObjekt_1_Name = value; 
            OnPropertyChanged(); } }
        } 
    
    
    public class TestObjekt2 : ViewModelBase
        {
            int _testObjekt_2_Id;
            public int TestObjekt_2_Id 
            { get { return _testObjekt_2_Id; } 
            set { _testObjekt_2_Id = value; 
            OnPropertyChanged(); } }
    
            int _fremdIdVonTestObjekt_1_Id;
            public int FremdIdVonTestObjekt_1_Id 
            { get { return _fremdIdVonTestObjekt_1_Id; } 
            set { _fremdIdVonTestObjekt_1_Id = value;   
            OnPropertyChanged(); } }
    
            string _testObjekt_2_Name;
            public string TestObjekt_2_Name 
            { get { return _testObjekt_2_Name; } 
            set { _testObjekt_2_Name = value; 
            OnPropertyChanged(); } }
        } 
    
    
    public class TestObjekt3 : ViewModelBase
        {
            int _testObjekt_3_Id;
            public int TestObjekt_3_Id 
            { get { return _testObjekt_3_Id; } 
            set { _testObjekt_3_Id = value; 
            OnPropertyChanged(); } }
    
            int _fremdIdVontestObjekt_1_Id;
            public int FremdIdVonTestObjekt_1_Id { 
            get { return _fremdIdVontestObjekt_1_Id; } 
            set { _fremdIdVontestObjekt_1_Id = value;
            OnPropertyChanged(); } }
    
            int _fremdIdVontestObjekt_2_Id;
            public int FremdIdVonTestObjekt_2_Id { 
            get { return _fremdIdVontestObjekt_2_Id; } 
            set { _fremdIdVontestObjekt_2_Id = value; 
            OnPropertyChanged(); } }
    
            string _testObjekt_3_Name;
            public string TestObjekt_3_Name { 
            get { return _testObjekt_3_Name; } 
            set { _testObjekt_3_Name = value; 
            OnPropertyChanged(); } }
        } 

    Im ViewModel erstell ich ein paar Testdaten . . .

    public TestViewModel()
            {
                base.DisplayName =  
                Strings.MainWindowViewModel_Command_ViewTest;
    
                TestObjekte1 = new 
                ObservableCollection<TestObjekt1>(
                    new List<TestObjekt1>()
                        {
                            new TestObjekt1 
                          { TestObjekt_1_Id = 1, 
                            TestObjekt_1_Name = "Name1Testobjekt1" },
                            new TestObjekt1 
                          { TestObjekt_1_Id = 2, 
                            TestObjekt_1_Name = "Name2Testobjekt1" },
                            new TestObjekt1 
                          { TestObjekt_1_Id = 3, 
                            TestObjekt_1_Name = "Name3Testobjekt1" }
                        });
    
                TestObjekte2 = new ObservableCollection<TestObjekt2>(
                    new List<TestObjekt2>(
    )
                        {
                            new TestObjekt2 
                          { TestObjekt_2_Id = 1, 
                            FremdIdVonTestObjekt_1_Id = 1, 
                            TestObjekt_2_Name = "Name1Testobjekt2" },
                            new TestObjekt2 
                          { TestObjekt_2_Id = 2, 
                            FremdIdVonTestObjekt_1_Id = 1, 
                            TestObjekt_2_Name = "Name2Testobjekt2" },
                            new TestObjekt2 
                          { TestObjekt_2_Id = 3, 
                            FremdIdVonTestObjekt_1_Id = 1, 
                            TestObjekt_2_Name = "Name3Testobjekt2" },
                            new TestObjekt2 
                          { TestObjekt_2_Id = 4, 
                            FremdIdVonTestObjekt_1_Id = 2, 
                            TestObjekt_2_Name = "Name4Testobjekt2" },
                            new TestObjekt2 
                          { TestObjekt_2_Id = 5, 
                            FremdIdVonTestObjekt_1_Id = 2, 
                            TestObjekt_2_Name = "Name5Testobjekt2" },
                            new TestObjekt2 
                          { TestObjekt_2_Id = 6, 
                            FremdIdVonTestObjekt_1_Id = 2, 
                            TestObjekt_2_Name = "Name6Testobjekt2" },
                            new TestObjekt2 
                          { TestObjekt_2_Id = 7, 
                            FremdIdVonTestObjekt_1_Id = 3, 
                            TestObjekt_2_Name = "Name7Testobjekt2" },
                            new TestObjekt2 
                          { TestObjekt_2_Id = 8, 
                            FremdIdVonTestObjekt_1_Id = 3, 
                            TestObjekt_2_Name = "Name8Testobjekt2" },
                            new TestObjekt2 
                          { TestObjekt_2_Id = 9, 
                            FremdIdVonTestObjekt_1_Id = 3, 
                            TestObjekt_2_Name = "Name9Testobjekt2" }
                        });
    
                TestObjekte3 = new ObservableCollection<TestObjekt3>(
                    new List<TestObjekt3>()
                        {
                            new TestObjekt3 
                          { TestObjekt_3_Id = 1, 
                            FremdIdVonTestObjekt_1_Id = 1, 
                            FremdIdVonTestObjekt_2_Id = 1, 
                            TestObjekt_3_Name = "Name1Testobjekt3"},
                            new TestObjekt3 
                          { TestObjekt_3_Id = 2, 
                            FremdIdVonTestObjekt_1_Id = 1,
                            FremdIdVonTestObjekt_2_Id = 3, 
                            TestObjekt_3_Name = "Name2Testobjekt3"},
                            new TestObjekt3 
                          { TestObjekt_3_Id = 3, 
                            FremdIdVonTestObjekt_1_Id = 2,
                            FremdIdVonTestObjekt_2_Id = 4, 
                            TestObjekt_3_Name = "Name3Testobjekt3"},
                            new TestObjekt3 
                          { TestObjekt_3_Id = 4, 
                            FremdIdVonTestObjekt_1_Id = 2, 
                            FremdIdVonTestObjekt_2_Id = 5, 
                            TestObjekt_3_Name = "Name4Testobjekt3"},
                            new TestObjekt3 
                          { TestObjekt_3_Id = 5, 
                            FremdIdVonTestObjekt_1_Id = 3,
                            FremdIdVonTestObjekt_2_Id = 8,
                            TestObjekt_3_Name = "Name5Testobjekt3"},
                            new TestObjekt3 
                          { TestObjekt_3_Id = 6, 
                            FremdIdVonTestObjekt_1_Id = 3,
                            FremdIdVonTestObjekt_2_Id = 9, 
                            TestObjekt_3_Name = "Name6Testobjekt3"}
                        });
            } 


    Das Ganze wird dann folgendermaßen in der View an ein DataGird angebunden.

    <UserControl x:Class="MVVMTestProjekt.Views.TestView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                 xmlns:vm="clr-namespace:MVVMTestProjekt.ViewModels"
                 mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"
                 d:DataContext="{d:DesignInstance {x:Type vm:TestViewModel}}" FontSize="14">
        <Grid>
    
            <DataGrid AutoGenerateColumns="False"
                      CanUserAddRows="False"
                      ItemsSource="{Binding TestObjekte3, UpdateSourceTrigger=PropertyChanged}"
                      SelectedItem="{Binding SlectedTestObjekt3, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
    
                <DataGrid.Columns>
    
                    <DataGridTextColumn Header="IdTo3"
                                        Binding="{Binding TestObjekt_3_Id, UpdateSourceTrigger=PropertyChanged}" />
    
                    <DataGridComboBoxColumn Header="FremdIdTo1"
                                            SelectedValueBinding="{Binding FremdIdVonTestObjekt_1_Id, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                                            SelectedValuePath="TestObjekt_1_Id"
                                            DisplayMemberPath="TestObjekt_1_Name">
    
                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox"
                                   BasedOn="{StaticResource {x:Type ComboBox}}">
                                <Setter Property="ItemsSource"
                                        Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                                                    Path=DataContext.TestObjekte1, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>
    
                    </DataGridComboBoxColumn>
    
                    <DataGridComboBoxColumn Header="FremdIdTo2"
                                            SelectedValueBinding="{Binding FremdIdVonTestObjekt_2_Id, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
                                            SelectedValuePath="TestObjekt_2_Id"
                                            DisplayMemberPath="TestObjekt_2_Name">
    
                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox"
                                   BasedOn="{StaticResource {x:Type ComboBox}}">
                                <Setter Property="ItemsSource"
                                        Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},
                                                    Path=DataContext.TestObjekte2, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>
    
                    </DataGridComboBoxColumn>
    
                    <DataGridTextColumn Header="NameTo3"
                                        Binding="{Binding TestObjekt_3_Name, UpdateSourceTrigger=PropertyChanged}" />
    
                </DataGrid.Columns>
    
            </DataGrid>
    
        </Grid>
    </UserControl> 

    Die ItemsSource der ersten CoboBox ist die "TestObjekte1Collection".
    Die ItemsSource der zweiten Combobox ist die "TestObjekte2Collection".
    Die SelectedItems entsprechen jeweils der in TestObjekt3 gespeicherten "FremdId's" (siehe erstes Bild).

    Wenn ich nun die zweite ComboBox aufklappe werden alle Objekte der
    "TestObjekte2Collection" aufgelistet (siehe zweites Bild).

    Ich möchte aber, dass in der zweiten CombBox nur die TestObjekte2 angezeigt werden, die zu TestObjekt1- in der ComboBox davor - gemäß ihrer ID's angezeigt werden. So eine Art Filter also (siehe bearbeitetes drittes Bild).

    Könntet ihr mir hier Tipps geben, wie ich das realisieren könnte?

    Danke und Gruß
    Torsten




    • Bearbeitet Torsten-Müller Sonntag, 4. Februar 2018 19:37 Bild war an der falschen Stelle
    Sonntag, 4. Februar 2018 19:34

Antworten

  • Hi Torsten,
    wenn Du nicht mit einer Detailansicht arbeiten möchtest, sondern mit Combobox-Spalten, dann kannst Du meinen geposteten Code als Grundlage nutzen. Je nachdem, welche Randbedingungen zu realisieren sind, könnte die folgende Demo Ideen liefern. In der Demo habe ich die Member des ViewModels in eine Spalte integriert, so dass direkt in der Spalte über eine Combobox anstelle in der Combobox in der Detailansicht ausgewählt werden kann. 

    XAML:

    <Window x:Class="WpfApp1CS.Window32"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1CS"
            mc:Ignorable="d"
            Title="Window32" Height="300" Width="800">
      <Window.Resources>
        <local:Window32VM x:Key="vm"/>
        <local:Window32Conv x:Key="conv"/>
      </Window.Resources>
      <Grid DataContext="{StaticResource vm}">
        <DataGrid ItemsSource="{Binding View}" AutoGenerateColumns="False">
          <DataGrid.Columns>
            <DataGridTextColumn Header="IdTo3" IsReadOnly="True" Binding="{Binding TestObjekt_3_Id}" />
            <DataGridComboBoxColumn Header="NameTo1"
                                    ItemsSource="{Binding Source={StaticResource vm}, Path=View1}"
                                    SelectedValueBinding="{Binding FremdIdVonTestObjekt_1_Id, UpdateSourceTrigger=PropertyChanged}"
                                    SelectedValuePath="TestObjekt_1_Id"
                                    DisplayMemberPath="TestObjekt_1_Name"/>
            <DataGridTemplateColumn Header="NameTo2">
              <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  <Label Content="{Binding FremdIdVonTestObjekt_2_Id, Converter={StaticResource conv}}"/>
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
              <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                  <ComboBox 
                    ItemsSource="{Binding Source={StaticResource vm}, Path=View2f}"
                                    SelectedValue="{Binding FremdIdVonTestObjekt_2_Id}"
                                    SelectedValuePath="TestObjekt_2_Id"
                                    DisplayMemberPath="TestObjekt_2_Name"/>
                </DataTemplate>
              </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="NameTo3" IsReadOnly="True" Binding="{Binding TestObjekt_3_Name}" />
          </DataGrid.Columns>
        </DataGrid>
      </Grid>
    </Window>
    

    Dazu die Klassen:

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Globalization;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Windows;
    using System.Windows.Data;
    using static WpfApp1CS.Window32;
    
    namespace WpfApp1CS
    {
      /// <summary>
      /// Interaction logic for Window32.xaml
      /// </summary>
      public partial class Window32 : Window
      {
        public Window32() { InitializeComponent(); }
        public class ViewModelBase : INotifyPropertyChanged
        {
          #region  OnPropertyChanged
          public event PropertyChangedEventHandler PropertyChanged;
          internal void OnPropertyChanged([CallerMemberName] string propName = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
          #endregion
        }
    
        public class TestObjekt1 : ViewModelBase
        {
          int _testObjekt_1_Id;
          public int TestObjekt_1_Id
          {
            get { return _testObjekt_1_Id; }
            set { _testObjekt_1_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_1_Name;
          public string TestObjekt_1_Name
          {
            get { return _testObjekt_1_Name; }
            set { _testObjekt_1_Name = value; OnPropertyChanged(); }
          }
        }
        public class TestObjekt2 : ViewModelBase
        {
          int _testObjekt_2_Id;
          public int TestObjekt_2_Id
          {
            get { return _testObjekt_2_Id; }
            set { _testObjekt_2_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVonTestObjekt_1_Id;
          public int FremdIdVonTestObjekt_1_Id
          {
            get { return _fremdIdVonTestObjekt_1_Id; }
            set { _fremdIdVonTestObjekt_1_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_2_Name;
          public string TestObjekt_2_Name
          {
            get { return _testObjekt_2_Name; }
            set { _testObjekt_2_Name = value; OnPropertyChanged(); }
          }
        }
        public partial class TestObjekt3 : ViewModelBase
        {
          int _testObjekt_3_Id;
          public int TestObjekt_3_Id
          {
            get { return _testObjekt_3_Id; }
            set { _testObjekt_3_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVontestObjekt_1_Id;
          public int FremdIdVonTestObjekt_1_Id
          {
            get { return _fremdIdVontestObjekt_1_Id; }
            set { _fremdIdVontestObjekt_1_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVontestObjekt_2_Id;
          public int FremdIdVonTestObjekt_2_Id
          {
            get { return _fremdIdVontestObjekt_2_Id; }
            set { _fremdIdVontestObjekt_2_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_3_Name;
          public string TestObjekt_3_Name
          {
            get { return _testObjekt_3_Name; }
            set { _testObjekt_3_Name = value; OnPropertyChanged(); }
          }
        }
        public partial class TestObjekt3
        {
          public string  FremdIdVonTestObjekt_2_Name
          {
            get
            {
              Window32VM vm = (Window32VM)Application.Current.Resources["vm"];
              return _fremdIdVontestObjekt_2_Id.ToString();
            }
          }
        }
        public class TestViewModel
        {
          public ObservableCollection<TestObjekt1> TestObjekte1 = new
          ObservableCollection<TestObjekt1>(
              new List<TestObjekt1>()
                  {
                            new TestObjekt1
                          { TestObjekt_1_Id = 1,
                            TestObjekt_1_Name = "Name1Testobjekt1" },
                            new TestObjekt1
                          { TestObjekt_1_Id = 2,
                            TestObjekt_1_Name = "Name2Testobjekt1" },
                            new TestObjekt1
                          { TestObjekt_1_Id = 3,
                            TestObjekt_1_Name = "Name3Testobjekt1" }
                  });
          public ObservableCollection<TestObjekt2> TestObjekte2 = new ObservableCollection<TestObjekt2>(
              new List<TestObjekt2>() {
                            new TestObjekt2
                          { TestObjekt_2_Id = 1,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name1Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 2,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name2Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 3,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name3Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 4,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name4Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 5,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name5Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 6,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name6Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 7,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name7Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 8,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name8Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 9,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name9Testobjekt2" }
                  });
          public ObservableCollection<TestObjekt3> TestObjekte3 = new ObservableCollection<TestObjekt3>(
              new List<TestObjekt3>()
                  {
                            new TestObjekt3
                          { TestObjekt_3_Id = 1,
                            FremdIdVonTestObjekt_1_Id = 1,
                            FremdIdVonTestObjekt_2_Id = 1,
                            TestObjekt_3_Name = "Name1Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 2,
                            FremdIdVonTestObjekt_1_Id = 1,
                            FremdIdVonTestObjekt_2_Id = 3,
                            TestObjekt_3_Name = "Name2Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 3,
                            FremdIdVonTestObjekt_1_Id = 2,
                            FremdIdVonTestObjekt_2_Id = 4,
                            TestObjekt_3_Name = "Name3Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 4,
                            FremdIdVonTestObjekt_1_Id = 2,
                            FremdIdVonTestObjekt_2_Id = 5,
                            TestObjekt_3_Name = "Name4Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 5,
                            FremdIdVonTestObjekt_1_Id = 3,
                            FremdIdVonTestObjekt_2_Id = 8,
                            TestObjekt_3_Name = "Name5Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 6,
                            FremdIdVonTestObjekt_1_Id = 3,
                            FremdIdVonTestObjekt_2_Id = 9,
                            TestObjekt_3_Name = "Name6Testobjekt3"}
                  });
        }
      }
    
      public class Window32VM : INotifyPropertyChanged
      {
        TestViewModel dl = new TestViewModel();
        CollectionViewSource cvs = new CollectionViewSource();
        CollectionViewSource cvs1 = new CollectionViewSource();
        CollectionViewSource cvs2 = new CollectionViewSource();
        public ICollectionView View
        {
          get
          {
            if (cvs.Source == null)
            {
              cvs.Source = dl.TestObjekte3;
              cvs.View.CurrentChanged += (sender, e) =>
              {
                CurrentObject = cvs.View.CurrentItem as TestObjekt3;
                OnPropertyChanged(nameof(CurrentObject));
                OnPropertyChanged(nameof(View2f));
              };
              if (dl.TestObjekte3[0] != null) CurrentObject = dl.TestObjekte3[0];
            }
            return cvs.View;
          }
        }
        public TestObjekt3 CurrentObject { get; set; }
        public ICollectionView View1
        {
          get
          {
            cvs1.Source = dl.TestObjekte1;
            return cvs1.View;
          }
        }
        public ICollectionView View2
        {
          get
          {
            cvs2.Source = dl.TestObjekte2;
            return cvs2.View;
          }
        }
        public ICollectionView View2f
        {
          get
          {
            cvs2.Source = from item in dl.TestObjekte2 where item.FremdIdVonTestObjekt_1_Id == CurrentObject.FremdIdVonTestObjekt_1_Id select item;
            return cvs2.View;
          }
        }
        #region  OnPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string propName = "") =>
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        #endregion
      }
    
      public class Window32Conv : IValueConverter
      {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
          int id = (int)value;
          return (from item in (new TestViewModel()).TestObjekte2 where item.TestObjekt_2_Id == id select item.TestObjekt_2_Name).FirstOrDefault();
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
          throw new NotImplementedException();
        }
      }
    }


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 11. Februar 2018 09:09

Alle Antworten

  • Hi Torsten,
    Dein Ansinnen/Wunsch ist so nicht umsetzbar. Die Liste Testobjekt2 ist der gesamten Spalte zugewiesen. Das bedeutet, das die Liste in jedem Fall alle Elemente enthalten muss, die in irgendeiner Zeile anzuzeigen sind.

    Eine machbare Lösung besteht darin, dass die Datensätze nicht im DataGrid bearbeitet werden, sondern der aktuelle Datensatz in einem Panel zur Bearbeitung angezeigt wird. Dort kann man denn ComboBoxes nutzen, die ein gefilterte Liste als DataSource haben.

     

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 5. Februar 2018 13:01
  • Hallo Peter,

    erst mal besten Dank für deine Antwort!

    Verstehe ich dich richtig, dass ich mir dann praktisch so eine Art eigenes DataGrid bauen müsste, was aber tatsächlich gar keins ist?
    Das ist für mein bisheriges Grundwissen im Moment glaube ich eine Nummer zu groß. ;)

    Ich hatte noch eine andere Idee, die ich noch testen wollte.
    Was wäre, wenn ich das TestObjekt1 um eine property in form einer List<TestObjekt2> erweitere
    und in diese Liste dann jeweils nur die TestObjekte2 einfüge, die zum jeweiligen TestObjekt1 gehören?

    Könnte ich dann per Path=DataContext.TestObjekte1.TestObjekte2 zum Beispiel darauf zugreifen?

    Besten Dank und viele Grüße
    Torsten

    Montag, 5. Februar 2018 19:06
  • Hi Torsten,
    natürlich kannst Du irgendetwas anderes basteln.

    Das DataGrid hält selbst keine Daten. Es holt sich im Moment, wo ein Refresh erforderlich ist, die Daten aus dem zugewiesenen Datenpuffer (DataSource). So ein Refresh ist z.B. erforderlich, wen Fenster bewegt werden und das DataGrid zeitweilig verdeckt wird. Deshalb ist die vollständige Liste aller Nachschlage-Objekte einer Combobox-Spalte immer erforderlich und kann im Edit-Modus einer Zelle auch nicht eingeschränkt (gefiltert) werden.

    Du kannst natürlich auch Objekte schachteln, aber die Combobox-Spalte erfordert auch in diesem Fall die gesamte Nachschlagemenge für alle zeilen. Die ItemsSource-Spalte gilt für alle Zellen der Spalte und kann deshalb nicht für eine Zelle gesondert behandelt werden.

    Ob da ein Celltemplate eine Lösung ermöglicht, habe ich noch nicht probiert. Ich löse solche Fälle immer mit einem Panel, dem die aktuelle Zeile zugewiesen wird und im Panel nutze ich ComboBoxes. Da kann ich dann die Liste der Combobox filtern.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Montag, 5. Februar 2018 20:14
  • Hi Peter, nur damit ich jetzt auf die richtige Spur komme. Baust du das Panel in die DataGridColumn ein, oder baust du ein komplett eigenes DataTemplate, was am Ende eben erst mal jedes Element der List<Testobjekte3> darstellt und darin dann wieder Panels, die dann die anderen Testobjekte halten?
    Dienstag, 6. Februar 2018 19:43
  • Hi Torsten,
    ich nutze ein Grid mit 2 Spalten, links das DataGrid und rechts das Panel. das aktellen DatenObjekt (CurrentItem), was links der Bediener infolge der Navigation durch die Zeilen des DataGrids auswählt, wird rechts zum DateContext des Panels (Grid). Und im Panel können die Detaildaten incl. der Bindung an ComboBoxes mit gefilterten Listen der Nachschlagetabellen angezeigt und verwaltet werden.


    Ergänzung Code-Beispiel zur Demo:

    XAML:

    <Window x:Class="WpfApp1CS.Window31"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1CS"
            mc:Ignorable="d"
            Title="Window31" Height="300" Width="800">
      <Window.Resources>
        <local:Window31VM x:Key="vm"/>
      </Window.Resources>
      <Grid DataContext="{StaticResource vm}">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto"/>
          <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <DataGrid Grid.Column="0" ItemsSource="{Binding View}" AutoGenerateColumns="False">
          <DataGrid.Columns>
            <DataGridTextColumn Header="IdTo3" IsReadOnly="True" Binding="{Binding TestObjekt_3_Id}" />
            <DataGridComboBoxColumn Header="NameTo1" IsReadOnly="True"
                                    ItemsSource="{Binding Source={StaticResource vm}, Path=View1}"
                                    SelectedValueBinding="{Binding FremdIdVonTestObjekt_1_Id}"
                                    SelectedValuePath="TestObjekt_1_Id"
                                    DisplayMemberPath="TestObjekt_1_Name"/>
            <DataGridComboBoxColumn Header="NameTo2" IsReadOnly="True"
                                    ItemsSource="{Binding Source={StaticResource vm}, Path=View2}"
                                    SelectedValueBinding="{Binding FremdIdVonTestObjekt_2_Id}"
                                    SelectedValuePath="TestObjekt_2_Id"
                                    DisplayMemberPath="TestObjekt_2_Name"/>
            <DataGridTextColumn Header="NameTo3" IsReadOnly="True" Binding="{Binding TestObjekt_3_Name}" />
          </DataGrid.Columns>
        </DataGrid>
        <Grid Grid.Column="1" DataContext="{Binding CurrentObject}">
          <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition/>
          </Grid.ColumnDefinitions>
          <Label Grid.Row="0" Grid.Column="0" Content="TestObjekt_3_Id"/>
          <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding TestObjekt_3_Id}" IsReadOnly="True"/>
          <Label Grid.Row="1" Grid.Column="0" Content="TestObjekt_1_Name"/>
          <ComboBox Grid.Row="1" Grid.Column="1" 
                    ItemsSource="{Binding Source={StaticResource vm}, Path=View1}"
                    DisplayMemberPath="TestObjekt_1_Name"
                    SelectedValuePath="TestObjekt_1_Id"
                    SelectedValue="{Binding FremdIdVonTestObjekt_1_Id}"/>
          <Label Grid.Row="2" Grid.Column="0" Content="TestObjekt_2_Name"/>
          <ComboBox Grid.Row="2" Grid.Column="1" 
                    ItemsSource="{Binding Source={StaticResource vm}, Path=View2f}"
                    DisplayMemberPath="TestObjekt_2_Name"
                    SelectedValuePath="TestObjekt_2_Id" 
                    SelectedValue="{Binding FremdIdVonTestObjekt_2_Id}"/>
          <Label Grid.Row="3" Grid.Column="0" Content="TestObjekt_3_Name"/>
          <TextBox Grid.Row="3" Grid.Column="1" Text="{Binding TestObjekt_3_Name}" IsReadOnly="True"/>
        </Grid>
      </Grid>
    </Window>

    Und der Code dazu:

    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Windows;
    using System.Windows.Data;
    using static WpfApp1CS.Window31;
    
    namespace WpfApp1CS
    {
    
    
      /// <summary>
      /// Interaction logic for Window31.xaml
      /// </summary>
      public partial class Window31 : Window
      {
        public Window31() { InitializeComponent(); }
        public class ViewModelBase : INotifyPropertyChanged
        {
          #region  OnPropertyChanged
          public event PropertyChangedEventHandler PropertyChanged;
          internal void OnPropertyChanged([CallerMemberName] string propName = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
          #endregion
        }
    
        public class TestObjekt1 : ViewModelBase
        {
          int _testObjekt_1_Id;
          public int TestObjekt_1_Id
          {
            get { return _testObjekt_1_Id; }
            set { _testObjekt_1_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_1_Name;
          public string TestObjekt_1_Name
          {
            get { return _testObjekt_1_Name; }
            set { _testObjekt_1_Name = value; OnPropertyChanged(); }
          }
        }
        public class TestObjekt2 : ViewModelBase
        {
          int _testObjekt_2_Id;
          public int TestObjekt_2_Id
          {
            get { return _testObjekt_2_Id; }
            set { _testObjekt_2_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVonTestObjekt_1_Id;
          public int FremdIdVonTestObjekt_1_Id
          {
            get { return _fremdIdVonTestObjekt_1_Id; }
            set { _fremdIdVonTestObjekt_1_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_2_Name;
          public string TestObjekt_2_Name
          {
            get { return _testObjekt_2_Name; }
            set { _testObjekt_2_Name = value; OnPropertyChanged(); }
          }
        }
        public class TestObjekt3 : ViewModelBase
        {
          int _testObjekt_3_Id;
          public int TestObjekt_3_Id
          {
            get { return _testObjekt_3_Id; }
            set { _testObjekt_3_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVontestObjekt_1_Id;
          public int FremdIdVonTestObjekt_1_Id
          {
            get { return _fremdIdVontestObjekt_1_Id; }
            set { _fremdIdVontestObjekt_1_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVontestObjekt_2_Id;
          public int FremdIdVonTestObjekt_2_Id
          {
            get { return _fremdIdVontestObjekt_2_Id; }
            set { _fremdIdVontestObjekt_2_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_3_Name;
          public string TestObjekt_3_Name
          {
            get { return _testObjekt_3_Name; }
            set { _testObjekt_3_Name = value; OnPropertyChanged(); }
          }
        }
        public class TestViewModel
        {
          public ObservableCollection<TestObjekt1> TestObjekte1 = new
          ObservableCollection<TestObjekt1>(
              new List<TestObjekt1>()
                  {
                            new TestObjekt1
                          { TestObjekt_1_Id = 1,
                            TestObjekt_1_Name = "Name1Testobjekt1" },
                            new TestObjekt1
                          { TestObjekt_1_Id = 2,
                            TestObjekt_1_Name = "Name2Testobjekt1" },
                            new TestObjekt1
                          { TestObjekt_1_Id = 3,
                            TestObjekt_1_Name = "Name3Testobjekt1" }
                  });
          public ObservableCollection<TestObjekt2> TestObjekte2 = new ObservableCollection<TestObjekt2>(
              new List<TestObjekt2>() {
                            new TestObjekt2
                          { TestObjekt_2_Id = 1,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name1Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 2,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name2Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 3,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name3Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 4,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name4Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 5,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name5Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 6,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name6Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 7,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name7Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 8,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name8Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 9,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name9Testobjekt2" }
                  });
          public ObservableCollection<TestObjekt3> TestObjekte3 = new ObservableCollection<TestObjekt3>(
              new List<TestObjekt3>()
                  {
                            new TestObjekt3
                          { TestObjekt_3_Id = 1,
                            FremdIdVonTestObjekt_1_Id = 1,
                            FremdIdVonTestObjekt_2_Id = 1,
                            TestObjekt_3_Name = "Name1Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 2,
                            FremdIdVonTestObjekt_1_Id = 1,
                            FremdIdVonTestObjekt_2_Id = 3,
                            TestObjekt_3_Name = "Name2Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 3,
                            FremdIdVonTestObjekt_1_Id = 2,
                            FremdIdVonTestObjekt_2_Id = 4,
                            TestObjekt_3_Name = "Name3Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 4,
                            FremdIdVonTestObjekt_1_Id = 2,
                            FremdIdVonTestObjekt_2_Id = 5,
                            TestObjekt_3_Name = "Name4Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 5,
                            FremdIdVonTestObjekt_1_Id = 3,
                            FremdIdVonTestObjekt_2_Id = 8,
                            TestObjekt_3_Name = "Name5Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 6,
                            FremdIdVonTestObjekt_1_Id = 3,
                            FremdIdVonTestObjekt_2_Id = 9,
                            TestObjekt_3_Name = "Name6Testobjekt3"}
                  });
        }
      }
    
      public class Window31VM : INotifyPropertyChanged
      {
        TestViewModel dl = new TestViewModel();
        CollectionViewSource cvs = new CollectionViewSource();
        CollectionViewSource cvs1 = new CollectionViewSource();
        CollectionViewSource cvs2 = new CollectionViewSource();
        public ICollectionView View
        {
          get
          {
            if (cvs.Source == null)
            {
              cvs.Source = dl.TestObjekte3;
              cvs.View.CurrentChanged += (sender, e) =>
              {
                CurrentObject = cvs.View.CurrentItem as TestObjekt3;
                OnPropertyChanged(nameof(CurrentObject));
                OnPropertyChanged(nameof(View2f));
              };
              if (dl.TestObjekte3[0] != null) CurrentObject = dl.TestObjekte3[0];
            }
            return cvs.View;
          }
        }
        public TestObjekt3 CurrentObject { get; set; }
        public ICollectionView View1
        {
          get
          {
            cvs1.Source = dl.TestObjekte1;
            return cvs1.View;
          }
        }
        public ICollectionView View2
        {
          get
          {
            cvs2.Source = dl.TestObjekte2;
            return cvs2.View;
          }
        }
        public ICollectionView View2f
        {
          get
          {
            cvs2.Source = from item in dl.TestObjekte2 where item.FremdIdVonTestObjekt_1_Id == CurrentObject.FremdIdVonTestObjekt_1_Id select item;
            return cvs2.View;
          }
        }
        #region  OnPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string propName = "") =>
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        #endregion
      }
    }

    --

    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks



    • Bearbeitet Peter Fleischer Mittwoch, 7. Februar 2018 07:19 Ergänzung Code
    Dienstag, 6. Februar 2018 19:57
  • Hi Peter, hab erst mal recht herzlichen Dank für deine Mühe! Ich komm leider vorm Wochenende nicht dazu das auszuprobieren. Ich melde mich danach auf jeden Fall noch mal bei dir. Noch mal vielen Dank dafür! Gruß Torsten
    Mittwoch, 7. Februar 2018 19:58
  • Hallo Peter,

    ich habe deinen Code jetzt getestet.

    Noch mal vielen Dank für deine Mühe!

    Es ist jedoch leider keine Lösung für mich, zumal ich die Funktion
    die ich mir wünsche schon gesehen habe.
    Allerdings ist das eine alte WinForms-Anwendung, von der es keinen SourceCode
    mehr gibt und das Steuerelement (DataGrid) war damals auch noch von einem Fremdanbieter.

    Ich muss also versuchen mir ein eigenes Control zu bauen, das am Ende optisch wie ein DataGrid
    aussieht aber im Hintergrund keines ist.

    Trotzdem noch mal vielen Dank.

    Viele Grüße

    Torsten

    Freitag, 9. Februar 2018 19:56
  • Hi Torsten,
    wenn Du nicht mit einer Detailansicht arbeiten möchtest, sondern mit Combobox-Spalten, dann kannst Du meinen geposteten Code als Grundlage nutzen. Je nachdem, welche Randbedingungen zu realisieren sind, könnte die folgende Demo Ideen liefern. In der Demo habe ich die Member des ViewModels in eine Spalte integriert, so dass direkt in der Spalte über eine Combobox anstelle in der Combobox in der Detailansicht ausgewählt werden kann. 

    XAML:

    <Window x:Class="WpfApp1CS.Window32"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfApp1CS"
            mc:Ignorable="d"
            Title="Window32" Height="300" Width="800">
      <Window.Resources>
        <local:Window32VM x:Key="vm"/>
        <local:Window32Conv x:Key="conv"/>
      </Window.Resources>
      <Grid DataContext="{StaticResource vm}">
        <DataGrid ItemsSource="{Binding View}" AutoGenerateColumns="False">
          <DataGrid.Columns>
            <DataGridTextColumn Header="IdTo3" IsReadOnly="True" Binding="{Binding TestObjekt_3_Id}" />
            <DataGridComboBoxColumn Header="NameTo1"
                                    ItemsSource="{Binding Source={StaticResource vm}, Path=View1}"
                                    SelectedValueBinding="{Binding FremdIdVonTestObjekt_1_Id, UpdateSourceTrigger=PropertyChanged}"
                                    SelectedValuePath="TestObjekt_1_Id"
                                    DisplayMemberPath="TestObjekt_1_Name"/>
            <DataGridTemplateColumn Header="NameTo2">
              <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                  <Label Content="{Binding FremdIdVonTestObjekt_2_Id, Converter={StaticResource conv}}"/>
                </DataTemplate>
              </DataGridTemplateColumn.CellTemplate>
              <DataGridTemplateColumn.CellEditingTemplate>
                <DataTemplate>
                  <ComboBox 
                    ItemsSource="{Binding Source={StaticResource vm}, Path=View2f}"
                                    SelectedValue="{Binding FremdIdVonTestObjekt_2_Id}"
                                    SelectedValuePath="TestObjekt_2_Id"
                                    DisplayMemberPath="TestObjekt_2_Name"/>
                </DataTemplate>
              </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="NameTo3" IsReadOnly="True" Binding="{Binding TestObjekt_3_Name}" />
          </DataGrid.Columns>
        </DataGrid>
      </Grid>
    </Window>
    

    Dazu die Klassen:

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Globalization;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Windows;
    using System.Windows.Data;
    using static WpfApp1CS.Window32;
    
    namespace WpfApp1CS
    {
      /// <summary>
      /// Interaction logic for Window32.xaml
      /// </summary>
      public partial class Window32 : Window
      {
        public Window32() { InitializeComponent(); }
        public class ViewModelBase : INotifyPropertyChanged
        {
          #region  OnPropertyChanged
          public event PropertyChangedEventHandler PropertyChanged;
          internal void OnPropertyChanged([CallerMemberName] string propName = "") =>
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
          #endregion
        }
    
        public class TestObjekt1 : ViewModelBase
        {
          int _testObjekt_1_Id;
          public int TestObjekt_1_Id
          {
            get { return _testObjekt_1_Id; }
            set { _testObjekt_1_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_1_Name;
          public string TestObjekt_1_Name
          {
            get { return _testObjekt_1_Name; }
            set { _testObjekt_1_Name = value; OnPropertyChanged(); }
          }
        }
        public class TestObjekt2 : ViewModelBase
        {
          int _testObjekt_2_Id;
          public int TestObjekt_2_Id
          {
            get { return _testObjekt_2_Id; }
            set { _testObjekt_2_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVonTestObjekt_1_Id;
          public int FremdIdVonTestObjekt_1_Id
          {
            get { return _fremdIdVonTestObjekt_1_Id; }
            set { _fremdIdVonTestObjekt_1_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_2_Name;
          public string TestObjekt_2_Name
          {
            get { return _testObjekt_2_Name; }
            set { _testObjekt_2_Name = value; OnPropertyChanged(); }
          }
        }
        public partial class TestObjekt3 : ViewModelBase
        {
          int _testObjekt_3_Id;
          public int TestObjekt_3_Id
          {
            get { return _testObjekt_3_Id; }
            set { _testObjekt_3_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVontestObjekt_1_Id;
          public int FremdIdVonTestObjekt_1_Id
          {
            get { return _fremdIdVontestObjekt_1_Id; }
            set { _fremdIdVontestObjekt_1_Id = value; OnPropertyChanged(); }
          }
          int _fremdIdVontestObjekt_2_Id;
          public int FremdIdVonTestObjekt_2_Id
          {
            get { return _fremdIdVontestObjekt_2_Id; }
            set { _fremdIdVontestObjekt_2_Id = value; OnPropertyChanged(); }
          }
          string _testObjekt_3_Name;
          public string TestObjekt_3_Name
          {
            get { return _testObjekt_3_Name; }
            set { _testObjekt_3_Name = value; OnPropertyChanged(); }
          }
        }
        public partial class TestObjekt3
        {
          public string  FremdIdVonTestObjekt_2_Name
          {
            get
            {
              Window32VM vm = (Window32VM)Application.Current.Resources["vm"];
              return _fremdIdVontestObjekt_2_Id.ToString();
            }
          }
        }
        public class TestViewModel
        {
          public ObservableCollection<TestObjekt1> TestObjekte1 = new
          ObservableCollection<TestObjekt1>(
              new List<TestObjekt1>()
                  {
                            new TestObjekt1
                          { TestObjekt_1_Id = 1,
                            TestObjekt_1_Name = "Name1Testobjekt1" },
                            new TestObjekt1
                          { TestObjekt_1_Id = 2,
                            TestObjekt_1_Name = "Name2Testobjekt1" },
                            new TestObjekt1
                          { TestObjekt_1_Id = 3,
                            TestObjekt_1_Name = "Name3Testobjekt1" }
                  });
          public ObservableCollection<TestObjekt2> TestObjekte2 = new ObservableCollection<TestObjekt2>(
              new List<TestObjekt2>() {
                            new TestObjekt2
                          { TestObjekt_2_Id = 1,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name1Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 2,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name2Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 3,
                            FremdIdVonTestObjekt_1_Id = 1,
                            TestObjekt_2_Name = "Name3Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 4,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name4Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 5,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name5Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 6,
                            FremdIdVonTestObjekt_1_Id = 2,
                            TestObjekt_2_Name = "Name6Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 7,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name7Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 8,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name8Testobjekt2" },
                            new TestObjekt2
                          { TestObjekt_2_Id = 9,
                            FremdIdVonTestObjekt_1_Id = 3,
                            TestObjekt_2_Name = "Name9Testobjekt2" }
                  });
          public ObservableCollection<TestObjekt3> TestObjekte3 = new ObservableCollection<TestObjekt3>(
              new List<TestObjekt3>()
                  {
                            new TestObjekt3
                          { TestObjekt_3_Id = 1,
                            FremdIdVonTestObjekt_1_Id = 1,
                            FremdIdVonTestObjekt_2_Id = 1,
                            TestObjekt_3_Name = "Name1Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 2,
                            FremdIdVonTestObjekt_1_Id = 1,
                            FremdIdVonTestObjekt_2_Id = 3,
                            TestObjekt_3_Name = "Name2Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 3,
                            FremdIdVonTestObjekt_1_Id = 2,
                            FremdIdVonTestObjekt_2_Id = 4,
                            TestObjekt_3_Name = "Name3Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 4,
                            FremdIdVonTestObjekt_1_Id = 2,
                            FremdIdVonTestObjekt_2_Id = 5,
                            TestObjekt_3_Name = "Name4Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 5,
                            FremdIdVonTestObjekt_1_Id = 3,
                            FremdIdVonTestObjekt_2_Id = 8,
                            TestObjekt_3_Name = "Name5Testobjekt3"},
                            new TestObjekt3
                          { TestObjekt_3_Id = 6,
                            FremdIdVonTestObjekt_1_Id = 3,
                            FremdIdVonTestObjekt_2_Id = 9,
                            TestObjekt_3_Name = "Name6Testobjekt3"}
                  });
        }
      }
    
      public class Window32VM : INotifyPropertyChanged
      {
        TestViewModel dl = new TestViewModel();
        CollectionViewSource cvs = new CollectionViewSource();
        CollectionViewSource cvs1 = new CollectionViewSource();
        CollectionViewSource cvs2 = new CollectionViewSource();
        public ICollectionView View
        {
          get
          {
            if (cvs.Source == null)
            {
              cvs.Source = dl.TestObjekte3;
              cvs.View.CurrentChanged += (sender, e) =>
              {
                CurrentObject = cvs.View.CurrentItem as TestObjekt3;
                OnPropertyChanged(nameof(CurrentObject));
                OnPropertyChanged(nameof(View2f));
              };
              if (dl.TestObjekte3[0] != null) CurrentObject = dl.TestObjekte3[0];
            }
            return cvs.View;
          }
        }
        public TestObjekt3 CurrentObject { get; set; }
        public ICollectionView View1
        {
          get
          {
            cvs1.Source = dl.TestObjekte1;
            return cvs1.View;
          }
        }
        public ICollectionView View2
        {
          get
          {
            cvs2.Source = dl.TestObjekte2;
            return cvs2.View;
          }
        }
        public ICollectionView View2f
        {
          get
          {
            cvs2.Source = from item in dl.TestObjekte2 where item.FremdIdVonTestObjekt_1_Id == CurrentObject.FremdIdVonTestObjekt_1_Id select item;
            return cvs2.View;
          }
        }
        #region  OnPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName] string propName = "") =>
          PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propName));
        #endregion
      }
    
      public class Window32Conv : IValueConverter
      {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
          int id = (int)value;
          return (from item in (new TestViewModel()).TestObjekte2 where item.TestObjekt_2_Id == id select item.TestObjekt_2_Name).FirstOrDefault();
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
          throw new NotImplementedException();
        }
      }
    }


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 11. Februar 2018 09:09
  • Hallo Peter,

    die grundsätzlich gewünschte Funktionsweise wird von deiner Demo realisiert,
    weshalb ich sie auch als Lösung markieren werde.
    Es ist eben nur schade, dass es nicht direkt in der DataGridRow implementiert werden kann.

    Die einzige Funktion die noch zum DataGrid gehören wird ist, dass man per "Einfg-Taste" eine
    Row erzeugen kann, um sich dort dann ein neues TestObjekt3 zu erstellen.

    Ich müsste noch mal probieren, ob ich dein Panel vielleicht in horizontaler Ausrichtung als
    RowDetailsTemplate einbauen kann.

    Dann wäre ich zumindest sehr nahe dran.

    Vielen Dank noch mal für deine Unterstützung!

    Viele Grüße

    Torsten

    Sonntag, 11. Februar 2018 12:08
  • Hi Torsten,
    ich verstehe nicht, warum was schade sein soll. Das DataGrid holt sich immer die Daten beim Refresh aus dem Datenpuffer. Und wenn die hierarchisch logisch organisierte Abhängigkeit sich nicht auch physisch in den Datenobjekten widerspiegelt, dann kann das auch eine DataGridRow nicht machen.

    Die Einfüge-Taste kann man ganz leicht mittels einer Interaction implementieren.

    Das Panel als RowDetail horizontal dargestellt, ermöglicht auch Werte in weiteren Eigenschaften des Datenobjektes zu verwalten. 


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Sonntag, 11. Februar 2018 13:41