Diskuze: Nefunkčný binding v inej triede
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 10 zpráv z 10.
//= 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.
Máš dvě možnosti - buď by tvoje třída měla vypadat takhle:
public class Log : INotifyPropertyChanged
{
private static Log instance;
public static Log Instance
{
get
{
if (instance == null)
{
instance = new Log();
}
return instance;
}
}
private Log()
{ }
string log;
public string logContent
{
get { return log; }
set
{
if (log != value)
{
log = value;
OnPropertyChanged("logContent");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
nebo pokud bude propertou nějaká kolekce tak používej ObservableCollection
class Log
{
public ObservableCollection<string> logContent { get; set; } = new ObservableCollection<string> { "" };//tady je jen jeden prvek, ale dej si jich kolik chces
private static Log instance;
public static Log Instance
{
get
{
if (instance == null)
{
instance = new Log();
}
return instance;
}
}
private Log()
{ }
}
já , protože jsem líný, tak i pro jednoduché vlastnosti používám
ObservableCollection s jediným prvkem
jak si nelze nevšimnout - je to mnohem jednodušší
Četl sis o Bindigu něco víc, než první odstavec na internetu? Abys mohl v kódu měnit vlastnosti, které jsou nabindované na nějaké kontrolky, potřebuješ při každé změně té vlastnoti vyvolat event PropertyChanged, který aktualizuje Bindingy na tu danou vlastnost. WPF má pro tohle interface INotifyPropertyChanged - přečti si o něm něco. Implementace viz přísěvek nade mnou.
Jestli to dobře chápu ta máš problém s použitím ObservableCollection - jistě k tomu máš důvod, tak sem s ním, a´t vím co dělám špatně a proč to není vhodné?
Tak je to Collection - trochu z toho plyne, že je určená pro ListBoxy, Comboboxy apod. ale ne pro jednotlivé property. Tak nějak na zmatení nepřítele, v tomto případě začátečníka. Chtěl bych vidět, jak s tím jako s kolekcí pracuješ, a jak vypadá Binding. Je to očividně kratší, ale že by to bylo nějak čitelné...
Dík za odpověď - teď vím a se mnou každý,kdo tohle vlákno čte a bude někdy číst, že mínuska jsou za mou "lenost" - ono totiž to může svádět k tomu, že nabízená řešení nejsou správná.
Ale stejně nechápu, co je špatného na kolekci o jednom prvku - kromě toho, že její instance potřebuje víc paměti, než obyčejná proměnná - ale to snad už v dnešní době nemusíme řešit - pokud teda těch bindovaných vlastností nejsou stovky . A když jsme u toho - od kolika prvků - třeba int se kolekce (ne pole) vyplatí?
A jak stím pracuju? - Jako s prvkem kolece na indexu [0].
Text="{Binding logContent[0]}"
Pro více názorností doporučuju například Clean Code: A Handbook of Agile Software Craftsmanship
-- Já dostat do ruky takovýhle kód, tak ho rovnou vyhodím.
Být potenciální zaměstanavatel a přijiít mi tam kandidát s tímto, tak
pohovor končí dřív než mohl začít
Od kolika prvků se kolekce vyplatí a pole ne? Pole používáš ve vyšších jazycích pro nějaký známý a ideálně i neměnný počet prvků, kdežto kolekce v případě, že prvky potřebuješ odebírat a přidávat. A pokud jsem to nepochopil a byla to byla otázka čistě na kolekce vs vlastnost, tak samozřejmě pro jeden prvek vlastnost a pro víc kolekce/pole (ale doufám, že ses na tohle neptal). Tak jako tak mi to příjde jako tvůj zásadní nedostatek.
Ty sám se v tom vyznáš, ale jak psali ostatní, ten kód není čistý - nestandartně použitá věc neznamená nutně originaritu a inovaci. Jestli se ti nechcou psát ty full property (nikomu se to nechce psát), tak si vytvoř utilitku, do které napíšeš datový typ a jméno Vlastnosti, a ona ti vyplivne propfull s getterem a setterem volajícím NotifyPropertyChanged. Je to sotva na 15 minut.
Dík teda všem za názory - argumenty beru - člověk se pořád učí. Prostě jsem jen využil možnosti ,která se nabízela, a není to dobře.
Takže abysme se vrátili k tazateli:
upravuju svou odpověď
Implementuj do třídy rozhraní INotifyPropertyChanged -
viz výše
u kolekcí použij ObservableCollection a v případě , že
použiješ pouze kolekce - nemusíš rozhraní do své třídy implementovat,
protože v ObservableCollection je už INotifyPropertyChanged
implementované
Zobrazeno 10 zpráv z 10.