come posso associare i campi di classe ad elementi all’interno di modelli personalizzati? (WPF)

come posso associare i campi di classe ad elementi all’interno di un modello ListBoxItem personalizzato?? questo codice di esempio manca di alcuni aspetti come la definizione di classe, il nome ListBox ecc., Ho solo lottare con il processo vincolante.

<ListBox>
    <ListBox.Resources>
        <Style TargetType="ListBoxItem">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>

                       <!-- how to bind class fields to these elements -->

                        <StackPanel Orientation="Horizontal">
                            <Label></Label>
                            <Image></Image>
                        </StackPanel>

                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.Resources>

    <!-- adding items dynamically -->

</ListBox>

il codice C # dovrebbe assomigliare a:

ListBoxItem listBoxItem = new ListBoxItem();
listBoxItem.Content = new MyClass(){ Name="MyName", Image="ImagePath"}
... append to ListBox ...

EN From: How can I bind class fields to elements inside custom templates ? (WPF)

More similar articles:

4 Comments

  1. capito. capito. classe C #:

            public class Hello
        {
            public string Name { get; set; }
            public string Description { get; set; }
            public string ImagePath { get; set; }
        }

    c # aggiunta dinamica:

    ListBoxItem lbi = new ListBoxItem();
    lbi.Content = new Hello() { Name = "hello man", Description="I am superman.", ImagePath="Images/myimage.png"};
    menu.Items.Add(lbi);

    XAML:

                <ListBox Name="menu" ItemsSource="{Binding}">
    
                    <ListBox.Resources>
    
                        <Style TargetType="ListBoxItem">
                            <Setter Property="ContentTemplate">
                                <Setter.Value>
    
                                    <DataTemplate>
                                        <StackPanel Orientation="Horizontal">
                                            <Label FontWeight="Bold" Content="{Binding Name}"></Label>
                                            <Label Content="{Binding Description}"></Label>
                                            <Image Source="{Binding ImagePath}" Width="30" Height="30"></Image>
                                        </StackPanel>
    
                                    </DataTemplate>
    
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </ListBox.Resources>
    
    
                </ListBox>
    1. ricordate di INotfyPropertyChanged interfaccia deve essere implementato altrimenti le modifiche non saranno riflessi sullo schermo! solo le proprietà sono supportate per Binding.

  2. quando si sviluppa in WPF MvvM è stato incoraggiato a promuovere la separazione delle preoccupazioni. per fare ciò si implementerebbe un modello di vista con proprietà che poi sarebbe legato alla vista. quando si desidera che l’interfaccia utente (vista) sia a conoscenza delle modifiche ai dati forniti da View Model, è necessario implementare l’interfaccia INotifyPropertyChanged, in questo modo:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Runtime.CompilerServices;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Input;
    using System.Windows.Threading;    
    
    namespace ViewModels
    {
        public class BaseViewModel : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
    
            public BaseViewModel()
            {
                 //ctor
            }
    
            protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                UIThread( () =>
                {
                    //make sure the event is raised on the main thread
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
                });
            }
    
            Dispatcher _dispacther;
    
            protected void UIThread(Action action)
            {
                if (_dispacther == null)
                {
                    _dispacther = Dispatcher.CurrentDispatcher;
                }
                _dispacther.Invoke(action);
            }
        }
    }

    la classe Hello deriva dal modello BaseViewModel e fornisce OnPropertyChanged (); nella proprietà come questa:

        private string name;
    
        public string Name
        {
            get { return name; }
            set { name= value; OnPropertyChanged(); }
        }

    ora, quando si cambia un nome dell’Articolo selezionato nella ListBox, esso verrà riflesso nell’interfaccia utente. provatelo!! questa implementazione assicura che l’evento è sollevato sul filo principale, quindi non è necessario farlo quando si invoca l’evento. anche [CallerMemberName] popolerà il nome della proprietà che si invocano!

Leave a Reply

Your email address will not be published. Required fields are marked *