Laden...

XAML, Listview und Data Binding

Erstellt von evo2 vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.786 Views
E
evo2 Themenstarter:in
24 Beiträge seit 2006
vor 17 Jahren
XAML, Listview und Data Binding

Hoi,

ich versuche mich grad an einer Listview, in der man einzelne Columns ein bzw ausblenden kann und das in einer xml Datei gespeichert wird.
Hab mich für den Anfang an Save ListView settings orientiert, aber da wird das ganze in der Registry gespeichert und funktioniert so auch nicht mit xaml.

Die einzelnen Daten aus der XML Datei zu laden klappt soweit ganz gut. Hab das DataBinding an die Listview nun auch hinbekommen(aber wahrscheinlich etwas umständlich).
Mein XML Datei ist wie folgt aufgebaut:


<ArrayOfColumns_Manage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Columns_Manage>
    <Name>PID</Name>
    <Position>0</Position>
    <Width>20</Width>
    <Show>true</Show>
    <Required>true</Required>
  </Columns_Manage>
...
</ArrayOfColumns_Manage>

Das ist mein struct:


[Serializable]
    public struct Columns_Manage
    {
        private string m_Name;
        public string Name
        {
            get { return m_Name; }
            set { m_Name = value; }
        }

        private int m_Position;
        public int Position
        {
            get { return m_Position; }
            set { m_Position = value; }
        }

        private int m_Width;
        public int Width
        {
            get { return m_Width; }
            set { m_Width = value; }
        }

        private bool m_Show;
        public bool Show
        {
            get { return m_Show; }
            set { m_Show = value; }
        }

        private bool m_Required;
        public bool Required
        {
            get { return m_Required; }
            set { m_Required = value; }
        }

        public Columns_Manage(string Name, int Position, int Width, bool Show, bool Required)
        {
            m_Name = Name;
            m_Position = Position;
            m_Width = Width;
            m_Show = Show;
            m_Required = Required;
        }
    }

Und so hole ich die Daten aus der XML Datei:


XmlSerializer xmlSer = new XmlSerializer(typeof(Columns_Manage[]));
            FileStream stream = new FileStream(xmlDocPath + file, FileMode.Open);
            m_Columns = (Columns_Manage[])xmlSer.Deserialize(stream);
            stream.Close();

So nun zu meinen eigentlichen Fragen 😉

  1. DataBinding:
    Ich bewerkstellige das Databinding wie folgt:
    C#

ObservableCollection<Columns_Manage> m_columns = 
new ObservableCollection<Columns_Manage>();

        XMLData xml = new XMLData();

        public ColumnSettings()
        {
            //ObservableCollection füllen
            foreach (Columns_Manage col in xml.m_Columns)
            {
                m_columns.Add(new Columns_Manage(
col.Name, col.Position, col.Width, col.Show, col.Required));
            }  
            InitializeComponent();
            listView1.ItemsSource = m_columns;

Ist das die normale Art eine ObservableCollection zu befüllen? Oder kann man dieses irgendwie anders/besser bewerkstelligen?

XAML


<CheckBox Margin="1,0,5,2" VerticalAlignment="Center" 
IsChecked="{Binding Mode=TwoWay, Path=Show, UpdateSourceTrigger=PropertyChanged}"/>
<TextBlock Text="{Binding Path=Name}"/>

Ich habe beim Databinding den Mode=TwoWay. Sprich, wenn jetzt ein Häckchen gesetzt bzw entfernt wird, sollte ich das ja nun irgendwie abfangen können. Nur wie?

Ist zwar ein bißel viel Text/Code für die kleine Frage, aber ich wollte es gut verdeutlichen 🙂

Ich hoffe mir kann da jemand ein Tipp geben bzw mich in die richtige Richtung schubsen.

Schonmal danke im vorraus.

Mfg
evo2

230 Beiträge seit 2007
vor 17 Jahren

Moin evo2

Ist das die normale Art eine ObservableCollection zu befüllen? Oder kann man dieses irgendwie anders/besser bewerkstelligen?

Ist die übliche Verfahrensweise und in der MSDN auch so dokumentiert!

Ich habe beim Databinding den Mode=TwoWay. Sprich, wenn jetzt ein Häckchen gesetzt bzw entfernt wird, sollte ich das ja nun irgendwie abfangen können. Nur wie?

Wenn Du mit Net 3.0 arbeitest, hast Du auch das SDK auf deiner Festplatte? Dort gibt es etliche Codebeispiele (wie z. Bsp: ListViewCheckBox), die Deine Frage beantwortet.
Wenn Du weiterhin gemischt arbeiten willst würde ich aus "struct Columns_Manage" eine Klasse machen, die die Schnittstelle
INotifyPropertyChanged erbt. Du kannst in "set" die entsprechende Benachrichtigung der Änderung auslösen. Das sähe dann so aus und ist ebenfalls in der MSDN dokumentiert:


public class Columns_Manage : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

        private string m_Name;
        public string Name
        {
            get { return m_Name; }
            set
            { 
                m_Name = value;
                OnPropertyChanged("Name");
            }
        }//end methode
    
.
.
.
.

    protected virtual void OnPropertyChanged(string strPropertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this,
                new PropertyChangedEventArgs(strPropertyName));
        }//end if
    }//end methode

}//end class  
 

Grüsse -Kalle