Laden...

Bindingfehler aber es bindet

Erstellt von Sindelfinger vor 2 Jahren Letzter Beitrag vor 2 Jahren 382 Views
S
Sindelfinger Themenstarter:in
39 Beiträge seit 2019
vor 2 Jahren
Bindingfehler aber es bindet

Hallöle und einen schönen sonnigen Freitag liebe Gemeinde.

Ich befürchte daß mir mal wieder das Verständnis fehlt. Ich habe eine WPF - Anwendung erstellt, dort im Hauptfenster eine ListView erstellt mit einem Item - Template auf mein Haupt - ViewModel. Wenn ich das Projekt nun starte, behauptet mein VS2019:

Datenkontext: Ziel: Zieltyp Beschreibung
String "ListView.ItemSource, Name="lstNewBase" IENumerable Die Eigenschaft "Bases" wurde im Objekt vom Typ "String" nicht gefunden.

Interessanterweise zeigt das Fenster trotzdem alles an, was ich angezeigt bekommen möchte.


            <ListView x:Name="lstNewTool" ItemsSource="{Binding Tools}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto" SelectionMode="Single" Margin="5" Width="400">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <views:ToolChangeView DataContext="{Binding}"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>


Und hier das dazugehörige ViewModel


   public class ToolViewModel :ViewModelBase
    {
        private int _toolnumber;
        private string _toolname;
        private RobFrame _tooldata;
        private bool _isused;

        public bool IsUsed
        {
            get
            {
                return _isused;
            }
            set
            {
                _isused = value;
                RaisePropertyChanged(nameof(IsUsed));
            }
        }
        public int ToolNumber
        {
            get
            {
                return _toolnumber;
            }
            set
            {
                _toolnumber = value;
                RaisePropertyChanged(nameof(ToolNumber));
            }
        }        
        public string ToolName
        {
            get
            {
                return _toolname;
            }
            set
            {
                _toolname = value;
                RaisePropertyChanged(nameof(ToolName));
            }
        }      
        public RobFrame ToolData
        {
            get
            {
                return _tooldata;
            }
            set
            {
                _tooldata = value;
                RaisePropertyChanged(nameof(ToolData));
            }
        }
        public ToolViewModel()
        {
            ToolNumber = 0;
            IsUsed = false;
            ToolName = "";
            ToolData = new RobFrame();
        }

    }

Da es gerade in Richtung Wochenende geht, wünsche ich Euch allen ein schönes solches. Herzliche Grüße aus dem sonnigen Süden

2 stupid 4 chess? No way.
2 stupid 4 C#? It seems so X(

P
441 Beiträge seit 2014
vor 2 Jahren

Welchen Typ hat denn die Property Tools? Die zeigst du nirgendwo, dass ist doch die, die abgemartert ist, diese müsste etwas sein,dass IEnumerable implementiert.

187 Beiträge seit 2009
vor 2 Jahren

Ich vermute mal, dass die Bindungen dadurch zustande kommen, weil Du den DataContext vom DataTemplate direkt auf das ToolViewModel bindest. Wie Papst schon angemerkt hat, fehlt das Tools-Property im ViewModel.

In Deinem ViewModel musst Du ein Property Tools vom Typ List<ToolViewModel> definieren. Du brauchst in dem Fall keine ObservableCollection<ToolViewModel>, da sich die Anzahl der Tools nicht ändert.
Das DataTemplate ToolChangeView änderst Du wie folgt.


        <DataTemplate DataType="{x:Type local:ToolViewModel}">
            <views:ToolChangeView />
        </DataTemplate>

Du solltest auch überlegen, ob Du das ToolViewModel nicht verallgemeinern kannst. Tooldate und Basedaten haben beim KUKA die gleiche Struktur.

Hier nochmals als Code:


        <ListView x:Name="lstNewTool" 
                  ItemsSource="{Binding Tools}" 
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
                  ScrollViewer.VerticalScrollBarVisibility="Auto" 
                  SelectionMode="Single" 
                  Margin="5" 
                  Width="400">
            <ListView.ItemTemplate>
                <DataTemplate DataType="{x:Type local:ToolViewModel}">
                    <StackPanel>
                        <TextBlock Text="{Binding ToolName}" />
                        <TextBlock Text="{Binding ToolNumber}" />
                        <TextBlock Text="{Binding ToolData.X}" />
                        <TextBlock Text="{Binding ToolData.Y}" />
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>


    public class MainWindowViewModel : ViewModelBase
    {
        public ObservableCollection<ToolViewModel> Tools { get; set; }

        public MainWindowViewModel()
        {
            Tools = new ObservableCollection<ToolViewModel>
            {
                new ToolViewModel()
            };
        }
    }

S
Sindelfinger Themenstarter:in
39 Beiträge seit 2019
vor 2 Jahren

Hallo Caveman

Es hat eine Weile gedauert, bis ich wieder darüber gestolpert bin. Dein Tip hat 100%ig funktioniert. Herzlichen Dank dafür.

2 stupid 4 chess? No way.
2 stupid 4 C#? It seems so X(