Diskuze: WPF binding
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
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.
v tomhle případě by sis musel ty textblocky generovat dynamicky podle počtu prvků v poli.
Pokuď by jsi měl vždy 3 textblocky, v té tvojí třídě si uděláš 3 property. Vytvoříš objekt a ten nastavíš do gridu (který si pojmenuješ)
gridVeKteremJsouTextBlocky.DataContext=objektMojiTridy;
textblocky budou vypadat následovně:
<TextBlock Text="{Binding property1}" />
<TextBlock Text="{Binding property2}" />
<TextBlock Text="{Binding property3}" />
Podívej se na můj tutoriál
http://www.itnetwork.cz/…tyly-binding
četl sis vůbec nějaký tutoriál?
Nemáš přiřazený datasource na class1
Nemáš to pole stringů jako property (což je při bindování "vhodné")
Nemáš vůbec nastavený binding v tom xamlu....
Rád bych ti pomohl, ale v tomhle případě by to znamenalo napsat to celé za
tebe..
Petr Domes : dík - prostuduju
Lako: jistě že četl - a ty jsi četl můj dotaz?
uvádím tam pouze jakousi kostru programu do které jak jsem původně doufal někdo doplní tři , čtyři řádky kódu - ale asi to , jak jsem pochopil není tak triviální.
Ano - čekal jsem , že to napíše někdo celé -a prakticky jsi to i udělal -jen by mi pomohlo, kdyby to bylo přímo v tom kódu
Třída kterou se bude bindovat
public class MyClass
{
public string Text1 { get; set; }
public string Text2 { get; set; }
public string Text3 { get; set; }
}
XAML
<Grid Name="bindingGrid" >
<TextBlock Text="{Binding Text1}" Height="23" HorizontalAlignment="Left" Margin="16,12,0,0" Name="textBlock1" VerticalAlignment="Top" />
<TextBlock Text="{Binding Text2}" Height="23" HorizontalAlignment="Left" Margin="16,35,0,0" Name="textBlock2" VerticalAlignment="Top" />
<TextBlock Text="{Binding Text3}" Height="23" HorizontalAlignment="Left" Margin="16,56,0,0" Name="textBlock3" VerticalAlignment="Top" />
</Grid>
Code behind
public MainWindow()
{
InitializeComponent();
MyClass mc = new MyClass();
mc.Text1 = "Můj text1";
mc.Text2 = "Můj text2";
mc.Text3 = "Můj text3";
bindingGrid.DataContext = mc;
}
Nyní by ti mělo být vše jasné
Tady je problém, že při změně té property se kontrolky sami neobnoví. Lepší je využít INotifyPropertyChanged nebo ještě lépe DependencyProperty
záleží, co s tím chce dělat. Pokuď chce zobrazovat data, která se mění jen s celým objektem, tak stačí nový objekt nabindovat.
naprosto jasné -dík
jinak to k čemu se chci časem dopracovat je kontinuální zobrazování dat přijatých přes com port - o příjem se stará příslušná třída, data můžou přijít kdykoliv a zatím to mám řešené ve WF tak, že pomocí časovače pravidelně z formuláře volám metodu co mi vrací hodnoty přijaté com portem, což není zrovna nejlepší řešení
není zač, rád poradím
Jinak k tomu k čemu se chceš dostat poradím toto:
dataGridu nastav parametr
IsReadOnly="True"
pro kolekci objektů, které chceš zobrazit v dataGridu použij
ObservableCollection
nově přidané objekty se ihned zobrazí v dataGridu
Řešení serioveho portu.
Využij eventu serioveho portu: DataReceived
Ta se zavolá vždy když něco příjde na port. Příjmutá data si nějak
zpracuješ a pak zavoláš nějakou vlastní eventu, kterou budeš mit
registrovanou ve WPF, a tam už jenom přidáš do kolekce nový objekt s
daty(automaticky se ti zobrazí).
Tak zatím jsem tedy zkusil ten INotifyPropertyChanged
tady je kód - pokud by zajímal nějakého začátečníka jako jsem já
tři TextBlocky + jeden button pro ověření funkčnosti - kliknutím se změní stringy v třídě i v kontrolkách
<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="263">
<Grid Name="grid1" Width="251" Height="314">
<TextBlock Height="30" Margin="80,107,82,174" Name="textBlock1" Text="{Binding Str1}" VerticalAlignment="Center" Background="#FF80D87F" Width="80" HorizontalAlignment="Center" FontSize="22" />
<TextBlock Height="30" Margin="80,159,80,122" Name="textBlock2" Text="{Binding Str2}" VerticalAlignment="Center" Width="80" Background="#FF80D87F" HorizontalAlignment="Center" FontSize="22" />
<TextBlock Height="30" Margin="80,210,82,71" Name="textBlock3" Text="{Binding Str3}" VerticalAlignment="Center" Width="80" Background="#FF80D87F" HorizontalAlignment="Center" FontSize="22" />
<Button Content="zmena" Height="23" Margin="85,66,81,222" Name="button1" VerticalAlignment="Center" Width="75" Click="button1_Click" HorizontalAlignment="Center" />
</Grid>
</Window>
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
Class1 c1 = new Class1();
public MainWindow()
{
InitializeComponent();
grid1.DataContext = c1;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
c1.Str1 = "qwe";
c1.Str2 = "asd";
c1.Str3 = "zxc";
}
}
}
namespace WpfApplication1
{
class Class1: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
private string[] str={"raz","dva","tri"};
public string Str1
{
get { return str[0]; }
set { str[0] = value; NotifyPropertyChanged("Str1"); }
}
public string Str2
{
get { return str[1]; }
set { str[1] = value; NotifyPropertyChanged("Str2"); }
}
public string Str3
{
get { return str[2]; }
set { str[2] = value; NotifyPropertyChanged("Str3"); }
}
public Class1()
{
}
}
}
Ale takhle to vypadá, že třída bude mít spoustu vlastností - spíš jsem počítal, že by stringy (texty pro TextBlocky) byly v nějaké kolekci - ale to jde asi jen při použití toho DataGridu?
jinak DataGrid asi nevyužiju- chtěl bych použít TextBlocky už jen pro to, že chci měnit třeba barvu pozadí, nebo barvu barvu/font písma v závislosti na hodnotách a nevím jestli je to vjednotlivých buňkách DataGridu možné.
Zobrazeno 10 zpráv z 10.