NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: textbox binding List<string>

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
František Pastorek:28.10.2016 9:35

Jednoducho nedokážem bindovať List<string> do textboxu.

XAML tetboxu

<TextBox x:Name="textBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextWrapping="Wrap" Text="{Binding ComboList1}"  />

hlavne okno

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            textBox.DataContext = Class1.Instance;
        }
    }

kod Class1

class Class1
    {
        public List<String> ComboList1 { get; set; }

        private static Class1 instance;
        public static Class1 Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Class1();
                }
                return instance;
            }
        }

        private Class1()
        {
            ComboList1 = new List<String>();
            ComboList1.Add("A");
            ComboList1.Add("B");
            ComboList1.Add("C");
            ComboList1.Add("D");
        }
    }

Vopred ďakujem.

 
Odpovědět
28.10.2016 9:35
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na František Pastorek
ostrozan:28.10.2016 10:22

nemůžeš bindovat do textBoxu celou kolekci, ale jen jeden prvek

<TextBox x:Name="textBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextWrapping="Wrap" Text="{Binding ComboList1[0]}"  />

jinak bys musel zvolit nějakou ItemsControl kontrolku - třeba

<ListView x:Name="ListW" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding ComboList1}"  />
 
Nahoru Odpovědět
28.10.2016 10:22
Avatar
Odpovídá na František Pastorek
Neaktivní uživatel:28.10.2016 10:22

Protože doslova binduješ List<> do property typu string (Text). WPF binding engine jaksi neví, co od něj chceš. Vytvoř si na toto ValueConvereter:

public class StringListToStringConverter : IValueConverter
       {
       //Zavolá se když source (List) má updatovat Target (TextBox.Text) - v parametru value bude právě List:
       public object Convert(object value, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
               {
                       string temp = "";
                       List<string> list = (List<string>)value;
                       foreach(string s in list)
                               temp += s;

                       return temp;
               }
               //zavolá se, když má TextBox.Text updatovat List. To nevím, jak chceš udělat, je to na tobě.
               public object ConvertBack(object value, Type targetType, object parameter,                                System.Globalization.CultureInfo culture)
               {
                    throw new NotImplementedException();
               }
       }

Při Bindingu potom ValueConverter specifikuješ (předpokládá se, že máš vytvořenou instanci třídy toho converteru někde v Resources v XAMLu)

<TextBox x:Name="textBox" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextWrapping="Wrap" Text="{Binding ComboList1, Converter={StaticResource listStringConverter}}"  />
Editováno 28.10.2016 10:25
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
28.10.2016 10:22
Neaktivní uživatelský účet
Avatar
František Pastorek:28.10.2016 16:10

Díky páni.

 
Nahoru Odpovědět
28.10.2016 16:10
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.