C# WPF UserControl-ok kapcsolatai
2015-11-10T10:46:56+01:00
2015-11-28T16:34:13+01:00
2022-08-09T21:40:32+02:00
anonymus0402
Sziasztok! Olyat szeretnék csinálni, hogy van egy UserControl-om, amin van egy CheckedListBox és van egy második UserControl-om, amin van egy button, egy richTextBox, és az első UserControl is rajta van.
Azt szeretném megoldani, hogy a button-ra kattintáskor jelenjen meg a richTextBox-ban a checkedListBox bepipált elemek tartalma. Hogyan oldható ez meg?
userControl1

<UserControl x:Class="Main.ucKezelofelulet" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Main" xmlns:valami="clr-namespace:Main" mc:Ignorable="d" MinHeight="300" MinWidth="650" Height="300" Width="650"> <Grid Margin="0,0,0,0" ShowGridLines="True"> <!--3 db sor--> <Grid.RowDefinitions> <RowDefinition Height="71"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Button x:Name="btnKeres" Content="Keresés" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="2,3,0,0" Height="20" Grid.Row="0" Click="btnKeres_Click" /> <valami:ucKiterjesztes x:Name="UCkiterjesztes" Visibility="Hidden" Height="auto" Width="220" HorizontalAlignment="Left" Grid.Row="1"></valami:ucKiterjesztes> <Grid Grid.Column="1" ShowGridLines="True"> <Border Grid.Row="0" Margin="5 5 5 2" Height="auto" Width="200" HorizontalAlignment="Right" BorderBrush="Aqua" BorderThickness="3"> <RichTextBox x:Name="rtbTalalatok1" Background="Aquamarine"> <FlowDocument> <Paragraph> <Run Text="Találatok"/> </Paragraph> </FlowDocument> </RichTextBox> </Border> </Grid> </Grid> </UserControl> //behind private void btnKeres_Click(object sender, RoutedEventArgs e) { itt kellene a checkedListBox checked elemeinek a szövegét kiíratni? hogyan? }
UserControl2

<UserControl x:Class="Main.ucKiterjesztes" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Main" mc:Ignorable="d" d:DesignHeight="329" d:DesignWidth="120"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <CheckBox x:Name="cbOsszes" Content="Összes" HorizontalAlignment="Left" Margin="10 5 5 5" VerticalAlignment="Top" Grid.Row="1"/> <ListBox ItemsSource="{Binding Customers}" Margin="10 5 5 5" Width="105" HorizontalAlignment="Left"> <ListBox.ItemTemplate> <DataTemplate> <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Path=Item.Name}" Checked="CheckBox_Checked" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </UserControl> //behind public class Customer { public string Name { get; set; } } public class CheckedListItem<T> : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private bool isChecked; private T item; public CheckedListItem() { } public CheckedListItem(T item, bool isChecked = false) { this.item = item; this.isChecked = isChecked; } public T Item { get { return item; } set { item = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Item")); } } public bool IsChecked { get { return isChecked; } set { isChecked = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("IsChecked")); } } } public delegate void SajatEsemeny(object sender, RoutedEventArgs e); public partial class ucKiterjesztes : UserControl { public ObservableCollection<CheckedListItem<Customer>> Customers { get; set; } public event SajatEsemeny SajatEsemenyNeve; public ucKiterjesztes() { InitializeComponent(); InitializeComponent(); Customers = new ObservableCollection<CheckedListItem<Customer>>(); Customers.Add(new CheckedListItem<Customer>(new Customer() { Name = "doc" })); Customers.Add(new CheckedListItem<Customer>(new Customer() { Name = "pdf" })); Customers.Add(new CheckedListItem<Customer>(new Customer() { Name = "txt" })); DataContext = this; } private void CheckBox_Checked(object sender, RoutedEventArgs e) { //Vagy itt kellene megeresni, a checked elemeket és az 1-es UC rtb-jében kiíratni? hogyan? } } }
Mutasd a teljes hozzászólást!
Ha esetleg valakinek hasonlóra lesz szüksége, megvan a megoldás:

// Main UI: <Window x:Class="Main.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Main" Title="MainWindow" Height="350" Width="764"> <Grid> <local:ucKezelofelulet></local:ucKezelofelulet> </Grid> </Window> //Main behind: semmi, csak az ami automatikus. //ucKiterjesztes: <UserControl x:Class="Main.ucKiterjesztes" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Main" mc:Ignorable="d" d:DesignHeight="329" d:DesignWidth="120"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <CheckBox x:Name="cbOsszes" Content="Összes" HorizontalAlignment="Left" Margin="10 5 5 5" VerticalAlignment="Top" Grid.Row="1" Click="cbOsszes_Click"/> <ListBox x:Name="lbTartalom" Margin="10 5 5 5" Width="105" HorizontalAlignment="Left"> <CheckBox ToolTip="text" Content="elso"/> <CheckBox ToolTip="text" Content="masodik"/> <CheckBox ToolTip="text" Content="harmadik"/> </ListBox> </Grid> </UserControl> //ucKiterjesztes behind: using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Main { public partial class ucKiterjesztes : UserControl { public ListBox lbTartalomFull { get { return lbTartalom; } set { lbTartalom = value; } } public ucKiterjesztes() { InitializeComponent(); } private void cbOsszes_Click(object sender, RoutedEventArgs e) { if (cbOsszes.IsChecked == true) { for (int i = 0; i < lbTartalomFull.Items.Count; i++) { CheckBox rrt = (CheckBox)lbTartalomFull.Items[i]; rrt.IsChecked = true; } } else { for (int i = 0; i < lbTartalomFull.Items.Count; i++) { CheckBox rrt = (CheckBox)lbTartalomFull.Items[i]; rrt.IsChecked = false; } } } } } //ucKezelofelulet: <UserControl x:Class="Main.ucKezelofelulet" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Main" mc:Ignorable="d" MinHeight="300" MinWidth="650" Height="300" Width="650"> <Grid Margin="0,0,0,0" ShowGridLines="True"> <!--3 db sor--> <Grid.RowDefinitions> <RowDefinition Height="71"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Button x:Name="btnKeres" Content="Keresés" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="2,3,0,0" Height="20" Grid.Row="0" Click="btnKeres_Click" /> <local:ucKiterjesztes x:Name="UCkit" Height="auto" Width="220" HorizontalAlignment="Left" Grid.Row="1"></local:ucKiterjesztes> <Grid Grid.Column="1" ShowGridLines="True"> <Border Grid.Row="0" Margin="5 5 5 2" Height="auto" Width="200" HorizontalAlignment="Right" BorderBrush="Aqua" BorderThickness="3"> <RichTextBox x:Name="rtbTalalatok1" Background="Aquamarine"> <FlowDocument> <Paragraph> <Run x:Name="talalatok" Text="Találatok"/> </Paragraph> </FlowDocument> </RichTextBox> </Border> </Grid> </Grid> </UserControl> //ucKezelofelulet behind: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Main { /// <summary> /// Interaction logic for ucKezelofelulet.xaml /// </summary> public partial class ucKezelofelulet : UserControl { public ucKezelofelulet() { InitializeComponent(); } private void btnKeres_Click(object sender, RoutedEventArgs e) { talalatok.Text = ""; bool isFound = false; for (int i = 0; i < UCkit.lbTartalomFull.Items.Count; i++) { if ( ((CheckBox)UCkit.lbTartalomFull.Items[i]).IsChecked == true ) { talalatok.Text += ((CheckBox)UCkit.lbTartalomFull.Items[i]).Content + "\r\n"; isFound = true; } } if (!isFound) { talalatok.Text = "Nincs találat!"; } } } }
Mutasd a teljes hozzászólást!

  • Üdv.

    Az eredmény szöveget is binding-al add meg:

    <Run Text="{Binding CheckedResult}"/>
    A check eseménykezelőben végig iterálsz a listán, a checked elemek nevét kigyűjtöd és a DataContext-ben a CheckedResult-nak értékül adod az eredményt.
    Vagyis a DataContext-be olyan class példány kell kerüljön aminek van egy CheckedResult property-je.

    Én valami ilyesmivel próbálkoznék.
    Mutasd a teljes hozzászólást!
  • Az a gondom, hogy még kezdő vagyok, és csak ismerkedem a WPF-fel.
    Eddig ott tartok, hogy van a MainWindow-om, amin csak egy menüpont van, melynek hatására, UserControl-ok jelennek meg. Egyik menüpont megjelenít egy UserControlt, és van egy másik menüpont, ami ugyan ezt a UC-t jeleníti meg, de ott már rajta van egy másik UC-is(MainWindows -> UserControl0 -> UserControl1/UserConrtol2/UserControl3...) Az UC1/2/3-on vannak checkedBox-ok, textBox-ok, és checkedListBox. Ezeknek az ezeknek az értékét szeretném vizsgálni au UC0-án. 
    De ne tudom, hogyan lehet ezeket elérni.
    Illetve a második problémám, hogy egy checkedListBox(pl: a példámban lévőnél) checked elemeit, hogy lehet megkeresni.

    Gondolom jó a logika, amit leírtál, csak nekem konkrétabb, szájbarágósabb megoldás kellene, amiből meg tudom érteni.

    Elnézést az értetlenkedésért. Remélem lesz valakinek türelme hozzám :)
    Mutasd a teljes hozzászólást!
  • Ha esetleg valakinek hasonlóra lesz szüksége, megvan a megoldás:

    // Main UI: <Window x:Class="Main.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:Main" Title="MainWindow" Height="350" Width="764"> <Grid> <local:ucKezelofelulet></local:ucKezelofelulet> </Grid> </Window> //Main behind: semmi, csak az ami automatikus. //ucKiterjesztes: <UserControl x:Class="Main.ucKiterjesztes" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Main" mc:Ignorable="d" d:DesignHeight="329" d:DesignWidth="120"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*"/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <CheckBox x:Name="cbOsszes" Content="Összes" HorizontalAlignment="Left" Margin="10 5 5 5" VerticalAlignment="Top" Grid.Row="1" Click="cbOsszes_Click"/> <ListBox x:Name="lbTartalom" Margin="10 5 5 5" Width="105" HorizontalAlignment="Left"> <CheckBox ToolTip="text" Content="elso"/> <CheckBox ToolTip="text" Content="masodik"/> <CheckBox ToolTip="text" Content="harmadik"/> </ListBox> </Grid> </UserControl> //ucKiterjesztes behind: using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Main { public partial class ucKiterjesztes : UserControl { public ListBox lbTartalomFull { get { return lbTartalom; } set { lbTartalom = value; } } public ucKiterjesztes() { InitializeComponent(); } private void cbOsszes_Click(object sender, RoutedEventArgs e) { if (cbOsszes.IsChecked == true) { for (int i = 0; i < lbTartalomFull.Items.Count; i++) { CheckBox rrt = (CheckBox)lbTartalomFull.Items[i]; rrt.IsChecked = true; } } else { for (int i = 0; i < lbTartalomFull.Items.Count; i++) { CheckBox rrt = (CheckBox)lbTartalomFull.Items[i]; rrt.IsChecked = false; } } } } } //ucKezelofelulet: <UserControl x:Class="Main.ucKezelofelulet" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Main" mc:Ignorable="d" MinHeight="300" MinWidth="650" Height="300" Width="650"> <Grid Margin="0,0,0,0" ShowGridLines="True"> <!--3 db sor--> <Grid.RowDefinitions> <RowDefinition Height="71"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <Button x:Name="btnKeres" Content="Keresés" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="2,3,0,0" Height="20" Grid.Row="0" Click="btnKeres_Click" /> <local:ucKiterjesztes x:Name="UCkit" Height="auto" Width="220" HorizontalAlignment="Left" Grid.Row="1"></local:ucKiterjesztes> <Grid Grid.Column="1" ShowGridLines="True"> <Border Grid.Row="0" Margin="5 5 5 2" Height="auto" Width="200" HorizontalAlignment="Right" BorderBrush="Aqua" BorderThickness="3"> <RichTextBox x:Name="rtbTalalatok1" Background="Aquamarine"> <FlowDocument> <Paragraph> <Run x:Name="talalatok" Text="Találatok"/> </Paragraph> </FlowDocument> </RichTextBox> </Border> </Grid> </Grid> </UserControl> //ucKezelofelulet behind: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace Main { /// <summary> /// Interaction logic for ucKezelofelulet.xaml /// </summary> public partial class ucKezelofelulet : UserControl { public ucKezelofelulet() { InitializeComponent(); } private void btnKeres_Click(object sender, RoutedEventArgs e) { talalatok.Text = ""; bool isFound = false; for (int i = 0; i < UCkit.lbTartalomFull.Items.Count; i++) { if ( ((CheckBox)UCkit.lbTartalomFull.Items[i]).IsChecked == true ) { talalatok.Text += ((CheckBox)UCkit.lbTartalomFull.Items[i]).Content + "\r\n"; isFound = true; } } if (!isFound) { talalatok.Text = "Nincs találat!"; } } } }
    Mutasd a teljes hozzászólást!
  • Ezzel csak az az egy baj van (ha működik is), hogy pont a wpf mivoltát dobja ki a kukába.
    Logikát építesz a View-ba, annak a ViewModel-ben lenne a helye.


    (cbOsszes.IsChecked == true)

    Mutasd a teljes hozzászólást!
  • Az már a MVVM tervezési minta szerinti megoldás lenne igaz? Azt még nem tudom hogy működik. De megköszönném, ha esetleg elküldené, hogy az alapján, hogy nézne ki ez a példa!
    Mutasd a teljes hozzászólást!
  • Segíthet..(Using WPF MVVM for Database Access)
    Ha sikerül átrágnod magad rajta, tán érthetőbbé válnak az MVVM lehetőségei.
    (én még gyötrődöm vele).
    Mutasd a teljes hozzászólást!
  • Összeraktam egy kis pélaprogit.
    Csatolmányban megtalálod.


    Néhány link és info:
    mvvm
    A bindingről rengeteg mindent megtalálsz a neten. (De a példádban már láttam, tehát gondolom használtad már)
    Nem csak propertiket, hanem parancsokat is lehet bindinggal megadni:

    <StackPanel Orientation="Horizontal"> <Button Content="Összes kijelölése" Command="{Binding SelectAll}" Width="150" /> <Button Content="Kijelölés megszümtetése" Command="{Binding DeSelectAll}" Width="150" /> </StackPanel <view:MainContent Grid.Row="1"></view:MainContent>
    Command="{Binding SelectAll}" -> MainViewModel


    public ICommand SelectAll ... SelectAll = new Command(new Action(SelectAllMethod));
    ICommand-ról is találsz a neten infót: RelayCommand vs RoutedCommand.

    A példádban kicsit összetettebb, mert miután lefut egy action, akkor egy property is változik így kerül végülis a view-ba az ami egyébként a rutin végeredménye.
    Ez ugye az INotifyPropertyChanged -el lehetséges.

    Most egyelőre ennyit, ha kérdésed van akkor még ránézek a témára valamikor.

    ps: én sem gyűröm olyan régóta és van sok sötét folt... de igyekszem :)
    Mutasd a teljes hozzászólást!
    Csatolt állomány
abcd