C# WPF Data binding alkalmazása class property-vel
2019-07-25T14:05:31+02:00
2019-07-26T09:38:57+02:00
2022-08-11T13:50:32+02:00
dargengurry
WPF-ben TexBox-hoz próbálom hozzácsatolni egy általam létrehozott egy osztály property-jét sikertelenül. Mi a megoldás szerintetek? Illetve GUI frissítésére milyen más megoldást javasolnátok?

Az alábbi kódban ha a DataContext-et átírom a TestTag-re akkor működik, viszom több Tag példányt szeretnék létrehozni, és mindegyiknek a Value property-jét hozzákötni az adott Texboxhoz/label-hez. Az XAML-ben kéne minden Textboxnál egyesével megadni a DataContext-eket? DataContext="{Binding TestTag}" Text="{Binding Value}" ezzel a taggal nem működött.

using System.ComponentModel; using System.Windows; namespace test_WPF4 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //DataContext = this; DataContext = TestTag; } Tags TestTag = new Tags(); private void Button_Click(object sender, System.Windows.RoutedEventArgs e) { if (TestTag.Value == "juhhu") TestTag.Value = "nem juhhú"; else TestTag.Value = "juhhu"; } } public class Tags : INotifyPropertyChanged { private string _Value = string.Empty; public string Value { get { return _Value; } set { if (_Value != value) { _Value = value; NotifyPropertyChanged(""); } } } public event PropertyChangedEventHandler PropertyChanged; public void NotifyPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } }
Az XAML:

<Window x:Class="test_WPF4.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:test_WPF4" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <Button Content="Button" HorizontalAlignment="Left" Margin="2" VerticalAlignment="Top" Width="256" Height="168" Click="Button_Click"/> <TextBox Text="{Binding Value}" HorizontalAlignment="Left" Height="144" Margin="248,227,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="256" FontSize="72"/> </Grid> </Window>
Mutasd a teljes hozzászólást!
Tags TestTag = new Tags();
Ez nem property. Ha DataContext = this; és {Binding TestTag}-ot irsz, akkor nem fog menni. De a VS-ben az output ablakban ezt írja is neked. Ez a sor az:
System.Windows.Data Error: 40 : BindingExpression path error: 'TestTag' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=TestTag.Value; DataItem='MainWindow' (Name=''); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')


Más: Ne frissíts mindig mindent, írj NotifyPropertyChanged("Value");-t, ahogy előbb javasolták.
Mutasd a teljes hozzászólást!

  • Mert a Binding csak propertykre működik.
    Mutasd a teljes hozzászólást!
  • set { if (_Value != value) { _Value = value; NotifyPropertyChanged(""); } }

    Ha nem adod meg mely property változott, hogyan frissítse a GUI-t?

    NotifyPropertyChanged("Value");
    Mutasd a teljes hozzászólást!
  • NotifyPropertyChanged("");
    Ha nincs az iézőjelek közt semmi, akkor az összeset befrissíti.
    Mutasd a teljes hozzászólást!
  • Mert a Binding csak propertykre működik.



    Ezt kifejtenéd?

    A mellékelt példában a TestTag.Value befrissül, a DataContext-tel van probléma.
    Mutasd a teljes hozzászólást!
  • Tags TestTag = new Tags();
    Ez nem property. Ha DataContext = this; és {Binding TestTag}-ot irsz, akkor nem fog menni. De a VS-ben az output ablakban ezt írja is neked. Ez a sor az:
    System.Windows.Data Error: 40 : BindingExpression path error: 'TestTag' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=TestTag.Value; DataItem='MainWindow' (Name=''); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')


    Más: Ne frissíts mindig mindent, írj NotifyPropertyChanged("Value");-t, ahogy előbb javasolták.
    Mutasd a teljes hozzászólást!
  • Kösz a segítséget!

    Az volt az elképzelésem eredetileg ebben a példában, hogy az XAML-ben minden TextBoxhoz XAML-ben az alábbi sorokat veszem fel:

    DataContext="{Binding TestTag}" Text="{Binding Value}"
    és ha működne így:

    DataContext="{Binding TestTag2}" Text="{Binding Value}" DataContext="{Binding TestTag3}" Text="{Binding Value}" //stb.
    De már sejtem, hogy a DataContext nem pont így működik.

    Más: Ne frissíts mindig mindent, írj NotifyPropertyChanged("Value");-t, ahogy előbb javasolták.

    Hát igen, a végcél majd az lesz, hogy csak az frissüljön, aminek kell, ebből a példából ezt kihagytam.

    Hát de akkor hogy lehet (maradva a példánál) a Tags osztály Value értékeit hozzákötni Textboxokhoz? 

    A Tags osztály alá még felvennék más értékeket, sokkal könnyebb lenne így a saját Tag-jeimet kezelni  (alapvetően PLC-hez kell, a PLC program címzéseit, addattípusait, tehát a PLC tag-jeit tárolnám a Tags osztályban)
    Mutasd a teljes hozzászólást!
  • Értem, mit akarsz.
    Na akkor mégegyszer olvasd el a hozzászólásomat! A TestTag nem property. A xaml kódod jó. Propertyket csinálj!
    Mutasd a teljes hozzászólást!
abcd