Diskuze: ListBox vs. Binding
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ukaž kousek kódu, jak jsi ho "nabindoval"...
No kód mám už dost rozsáhlí, ale snad postačí tohle:
Mám třídu rozhodčí :
class Rozhodci : INotifyPropertyChanged
{
public ObservableCollection<Tah> Tahy { get; set; }
Tahy.Add(novyTah);
V CodeBehin MainWindow v konstruktoru mám:
public MainWindow()
{
InitializeComponent();
DataContext = rozhodci;
A v MainWindow XAML:
<ListBox Name="hietorieTahuListBox" ItemsSource="{Binding Tahy}"
jak jsem psal v listBoxu se mi to zobrazuje jen se mi neposouvá "scroll" no posuvník když už mám víc prvků než je prostoru pro zobrazení. Děkuji
Já mám v XAMLu
<ListBox Name="lbVedouci" Grid.Column="0" Grid.Row="0" Margin="5" ItemsSource="{Binding Manager}" />
v kódu okna mám
lbVedouci.DataContext = spravceMobVedouci;
a v třídě
public ObservableCollection<MobVedouci> Manager { get; set; }
public SpravceMobVedouci()
{
Manager = new ObservableCollection<MobVedouci>();
}
a funguje to normálně...
Co znamená "neposouvá se focus"?
No že ten listBox má nějakou pevnou velikost, a když provádím jednotlivé tahy tak se mi každý zapíše na jeden řádek tak jak chci, no ale za chvíli je těch řádků samozřejmě víc než se vejde do kontrolky listBox. Samozřejmě se mi v tu chvíli zobrazí posuvník na pravé straně litBoxu, řádky se dále zapisují ale nejsou vidět musím ručně posunout posuvník. Je mi jasné že je to tím že nemám nastavený selectIndex a slectItem, ale nevím jak to zařídit když jen "binduji". Děkuji za trpělivost jsem úplnej začátečník .
Třeba takto:
https://stackoverflow.com/…tem-is-added
Zdravím, omlouvám se že to tak trvalo, ale mám problém s AJ (takže překladač Google) no jak asi tušíte nic moc pořád se motám do kola. Našel jsem na tvém odkazu jakýsi kód třídy
public class ListBoxExtenders : DependencyObject
{
#region Properties
public static readonly DependencyProperty AutoScrollToCurrentItemProperty = DependencyProperty.RegisterAttached("AutoScrollToCurrentItem", typeof(bool), typeof(ListBoxExtenders), new UIPropertyMetadata(default(bool), OnAutoScrollToCurrentItemChanged));
/// <summary>
/// Returns the value of the AutoScrollToCurrentItemProperty
/// </summary>
/// <param name="obj">The dependency-object whichs value should be returned</param>
/// <returns>The value of the given property</returns>
public static bool GetAutoScrollToCurrentItem(DependencyObject obj)
{
return (bool)obj.GetValue(AutoScrollToCurrentItemProperty);
}
/// <summary>
/// Sets the value of the AutoScrollToCurrentItemProperty
/// </summary>
/// <param name="obj">The dependency-object whichs value should be set</param>
/// <param name="value">The value which should be assigned to the AutoScrollToCurrentItemProperty</param>
public static void SetAutoScrollToCurrentItem(DependencyObject obj, bool value)
{
obj.SetValue(AutoScrollToCurrentItemProperty, value);
}
#endregion
#region Events
/// <summary>
/// This method will be called when the AutoScrollToCurrentItem
/// property was changed
/// </summary>
/// <param name="s">The sender (the ListBox)</param>
/// <param name="e">Some additional information</param>
public static void OnAutoScrollToCurrentItemChanged(DependencyObject s, DependencyPropertyChangedEventArgs e)
{
var listBox = s as ListBox;
if (listBox != null)
{
var listBoxItems = listBox.Items;
if (listBoxItems != null)
{
var newValue = (bool)e.NewValue;
var autoScrollToCurrentItemWorker = new EventHandler((s1, e2) => OnAutoScrollToCurrentItem(listBox, listBox.Items.CurrentPosition));
if (newValue)
listBoxItems.CurrentChanged += autoScrollToCurrentItemWorker;
else
listBoxItems.CurrentChanged -= autoScrollToCurrentItemWorker;
}
}
}
/// <summary>
/// This method will be called when the ListBox should
/// be scrolled to the given index
/// </summary>
/// <param name="listBox">The ListBox which should be scrolled</param>
/// <param name="index">The index of the item to which it should be scrolled</param>
public static void OnAutoScrollToCurrentItem(ListBox listBox, int index)
{
if (listBox != null && listBox.Items != null && listBox.Items.Count > index && index >= 0)
listBox.ScrollIntoView(listBox.Items[index]);
}
#endregion
}
ten jsem vložil do codebehin do definice class MainWindow : Window
dále jsem se v Xaml MainWindow pokusil o dvě věci:
<Window x:Name="hlavniOkno" x:Class="Evade._001.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Evade._001"
xmlns:Extenders="clr-namespace:Evade._001"
mc:Ignorable="d"
<ListBox Name="hietorieTahuListBox" ItemsSource="{Binding Tahy}" FontWeight="Normal"
ScrollViewer.CanContentScroll="True"
IsSynchronizedWithCurrentItem= "True"
Extenders:ListBoxExtenders.AutoScrollToCurrentItem="True"/>
při sestavení mi to píše:
1)
Závažnost Kód Popis Projekt Soubor Řádek
Chyba Název ListBoxExtenders neexistuje v oboru názvů clr-namespace:Evade._001. Evade.001 D:\Škola\EVADE\Evade.003\Evade.001\MainWindow.xaml 544
2)
Závažnost Kód Popis Projekt Soubor Řádek
Chyba Vlastnost ListBoxExtenders.AutoScrollToCurrentItem v oboru názvů XML clr-namespace:Evade._001 neexistuje. Řádek 544 pozice 26. Evade.001 D:\Škola\EVADE\Evade.003\Evade.001\MainWindow.xaml 544
3)
Závažnost Kód Popis Projekt Soubor Řádek
Chyba Připojitelná vlastnost AutoScrollToCurrentItem se nenašla v typu ListBoxExtenders. Evade.001 D:\Škola\EVADE\Evade.003\Evade.001\MainWindow.xaml 544
děkuji za trpělivost .
Jak na tom stále přemýšlím nebude nejjednodušší zapomenout na Binding
ListBoxu a přidávat tam prvky nějakou metodou kde zadám i "selectionChange",
pak budu moci reagovat na "selectionChange" v listBoxu metodou která má vsobě
něco jako "ListBox.ScrollIntoView(ListBox.SelectedItem);" .... nebo
vlastně dát obojí do té první metody kde jak přidám prvek do listBoxu tak
nastavím "selectionChange" a "ScrollIntoView" ?
Děkuji.
Zobrazeno 8 zpráv z 8.