Twee datasources binden aan een UI

Status
Niet open voor verdere reacties.

EspieNL

Gebruiker
Lid geworden
30 aug 2012
Berichten
7
Hoi,

In mijn WPF formulier heb ik aan de linkerkant 2 labels staan en aan de rechterkant 2 text velden. Bijde kanten wil ik de data laten binden uit een dictionary/datatabel.

Ik wil de labels vanuit een dictionary laten invullen zodat ik later de naamgevingen gemakkelijk kan aanpassen/vertalen naar een andere taal.

Helaas wordt bij de 2e binding de 1e overschreven waardoor de waarden wegvallen. Weet iemand hoe dit is op te lossen? Zelf ben ik een leek.

XAML
Code:
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Name="GridContent">
        
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        
        <Label Content="{Binding [label_firstname]}" Grid.Column="0" Grid.Row="0"/>
        <Label Content="{Binding [label_lastname]}" Grid.Column="0" Grid.Row="1"/>
        
        <TextBox Text="{Binding [str_firstname]}" Grid.Column="1" Grid.Row="0"/>
        <TextBox Text="{Binding [str_lastname]}" Grid.Column="1" Grid.Row="1" />
        
    </Grid>
</Window>

CS
Code:
namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // Set label 
            Dictionary<string, string> d = new Dictionary<string, string>();
            d.Add("label_firstname", "Firstname");
            d.Add("label_lastname", "Lastname");
            GridContent.DataContext = d;

            // Set textbox
            DataTable dt = new DataTable();
            dt.Columns.Add("str_Firstname", typeof(string));
            dt.Columns.Add("str_Lastname", typeof(string));
            dt.Rows.Add("Mike", "Smith");

            GridContent.DataContext = dt;


            
        }
    }
}
 
Ik zat te denken om gewoon je dictionary en table in een class te stoppen.

Misschien zoiets als dit:

Code:
    public class PersonContext
    {
        public Dictionary<string, string> Labels { get; set; }
        public DataTable Data { get; set; }

        public PersonContext()
        {
            Labels = new Dictionary<string, string>();
            Labels.Add("label_firstname", "Firstname");
            Labels.Add("label_lastname", "Lastname");
            
            Data = new DataTable();
            Data.Columns.Add("str_Firstname", typeof(string));
            Data.Columns.Add("str_Lastname", typeof(string));
            Data.Rows.Add("Mike", "Smith");
        }
    }

Je kunt dan denk ik wel deze class gebruiken als datasouce en linken zoals: Labels.label_firstname of Data.str_lastname

Het is maar een voorbeeld, je kunt eens kijken hoe met resource files normaal data wordt omgezet bij andere talen.
 
Een class in elkaar knutselen lukt nog wel, maar hij ik die data gebind krijg is mij een raadsel.
Het lukt wel om een om te binden, maar ze overschrijven elkaar.
 
Code:
GridContent.DataContext = new PersonContext();

<Label Content="{Binding [Labels.label_firstname]}" Grid.Column="0" Grid.Row="0"/>
Zoiets als dit zou wel moeten werken denk ik.

In dit geval, je kunt daarna in je view op je controls individueel linken. Zoiets als dit zou wel moeten werken denk ik.
(als het morgen nog niet werkt, zal ik een voorbeel project maken en uploaden, het is nu een beetje laat)
 
Een voorbeeldje zou wel wenselijk zijn. Heb het geprobeerd op de aangegeven wijze, maar krijg helaas geen waarde op het scherm te zien.
 
Het is gelukt. De individuele binding moest iets anders {Binding Labels.[label_firstname]}

.xaml
Code:
<Window x:Class="WpfApplication2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Name="GridContent">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <Label Content="{Binding Labels.[label_firstname]}" Grid.Column="0" Grid.Row="0" />
        <Label Content="{Binding Labels.[label_lastname]}" Grid.Column="0" Grid.Row="1" />

        <TextBox Text="{Binding Strings.[string_firstname]}" Grid.Column="1" Grid.Row="0" />
        <TextBox Text="" Grid.Column="1" Grid.Row="1" />
    </Grid>
</Window>

.cs
Code:
namespace WpfApplication2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            GridContent.DataContext = new PersonContext();
            
        }
    }
    public class PersonContext
    {
        public Dictionary<string, string> Labels { get; set; }
        public Dictionary<string, string> Strings { get; set; }

        public PersonContext()
        {
            Labels = new Dictionary<string, string>();
            Labels.Add("label_firstname", "Firstname");
            Labels.Add("label_lastname", "Lastname");

            Strings = new Dictionary<string, string>();
            Strings.Add("string_firstname", "Mike");
            Strings.Add("string_lastname", "Jansen");
        }
    }

    public class PersonValue
    {
        

        public PersonValue()
        {
            
        }
    }
}
 
Het is mij nog niet gelukt om een DataTable te binden.

Code:
 public PersonContext()
        {
            Strings = new DataTable();
            Strings.Columns.Add("Lastname", typeof(string));
            Strings.Rows.Add("Jansen");
        }

Code:
<TextBox Text="{Binding Path=Strings.[Lastname]}" Grid.Column="1" Grid.Row="0" />
 
Laatst bewerkt:
Zelf gebruik ik nooit datatables voor dit soort dingen. Ik zie wel dat je Binding Path= gebruikt ipv Binding.


Meestal doe ik zo iets als dit:
een class maken voor je personen
Code:
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }

        public Person(string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
        }

        public override string ToString()
        {
            return string.Format("{0} {1}", FirstName, LastName);
        }
    }

en dan ergens de people list binden:
Code:
	List<Person> people = new List<Person>();
	
	people.Add(new Person("Jan", "Janssen"));
	people.Add(new Person("Pieter", "Post"));
	people.Add(new Person("Bert", "Vries, de"));
 
Hmm, dat lukt ook allemaal wel. Als ik een class Person aanmaak kan ik die ook binden.
het probleem zit hem er nog steeds in dat ik zo niet 2 sources kan binden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan