PDA

View Full Version : سوال: انتخاب آیتم لیست باکس؟



behnam25214
پنج شنبه 09 دی 1389, 00:57 صبح
سلام دوستان

من یه لیست باکس دارم که توش چند تا آیتم هست، موقعی که برنامه رو اجرا میکنم میخوام وقتی روی یکی از آیتم ها کلیک کنم یه پیغام ظاهر بشه مثلا نام آیتم رو تو پیغام نشون بده.

ممنون میشم جواب بدین.
مرسی

مهدی فرزاد
پنج شنبه 09 دی 1389, 10:46 صبح
سلام
اینجوری که من متوجه شدم شما تعداد اتیم های لیست باکستون مشخص و محدود هست در این صورت شما یک متد به شکل زیر درست کنید


privatevoid ListBoxItem_PreviewMouseUp(object sender, MouseButtonEventArgs e)
{
ListBoxItem Litem = (ListBoxItem)sender;
MessageBox.Show(Litem.Content.ToString());
}


حالا به هرکدم از آیتم های لیست باکس این متد رو به برای اونت PreviewMouseUp معرفی کنید به شکل زیر


<ListBoxName="listBox1" Width="120">
<ListBoxItem Content="mehdi" PreviewMouseUp="ListBoxItem_PreviewMouseUp" />
<ListBoxItem Content="mohamad" PreviewMouseUp="ListBoxItem_PreviewMouseUp"/>
<ListBoxItem Content="majid" PreviewMouseUp="ListBoxItem_PreviewMouseUp"/>
</ListBox>


در غیر این صورت و اگه شما آیتمهاتون مشخص نیست و از یک دیتا بیس یا آبجکت اونها رو میخونید روش کار به این صورت است که

شما یک متد به شکل زیر درست میکنید


privatevoid TextBlock_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
TextBlock litem = (TextBlock)sender;
MessageBox.Show(litem.Text);
}


حالا باید یک DataTemplate برای لیست باکس درست کنید و این متد رو به اونت PreviewMouseUp تکس بلاکی که توی اون هست متصل کنید به شکل زیر


<Window.Resources>
<local:PersonalcsRestore x:Key="PersonalcsRestoreDataSource"/>


<DataTemplate x:Key="PersonalcsTemplate">
<StackPanel>
<TextBlock Text="{Binding FName, Mode=OneWay}" PreviewMouseUp="TextBlock_PreviewMouseUp"/>
</StackPanel>
</DataTemplate>


</Window.Resources>

<Grid DataContext="{Binding Source={StaticResource PersonalcsRestoreDataSource}}">

<ListBox Height="141" Margin="185,0,207,122" VerticalAlignment="Bottom" ItemTemplate="{DynamicResource PersonalcsTemplate}" ItemsSource="{Binding AllPersonal}"/>

</Grid>

فایل این مثال ضمیمه میباشد

behnam25214
جمعه 10 دی 1389, 23:23 عصر
مرسی و ممنون مهدی جان.

یه سوال این قسمت کد رو باید به هر TextBlock ی که دارم اضافه کنم.

privatevoid TextBlock_PreviewMouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
TextBlock litem = (TextBlock)sender;
MessageBox.Show(litem.Text);
}

مهدی فرزاد
شنبه 11 دی 1389, 00:03 صبح
سلام
ببین شما وقتی از DataTemplate استفاده میکنی نیاز نداری برای هر آیتم یک Template بسازی فقط یکی میسازی و تمام آیتمها از اون تبعیت میکن پس فقط یک بار این متد رو به تکس بلاکی که تو DataTemplate هست اختصاص میدی

<DataTemplate x:Key="PersonalcsTemplate">
<StackPanel>
<TextBlock Text="{Binding FName, Mode=OneWay}" PreviewMouseUp="TextBlock_PreviewMouseUp"/>
</StackPanel>
</DataTemplate>

و با کد زیر اون DataTemplate رو به لیست باکس اختصاص میدی

ItemTemplate="{DynamicResource PersonalcsTemplate}"

اون مثالی رو که ضمیمه گذاشتم با دقت بررسی کن متوجه میشی
(یادت باشه این برای حالتی هست که آیتمها لیست باکست از قبل مشخص نیست و از یک دیتا بیس یا دیتا آبجکت یا هر منبع دیگه خونده میشن)
(البته این نمونه ساده از DataTemplate بود و شما میتونید حالت های دیگه هم داشته باشی مثلا بجای یک تکس بلاک یک StackPanle بگذاری و توی اون دوتا TexBlok که یکی به فیلد نام و دیگری به فیلد نام خانوادگی Bind شده باشه ) در خصوص DataTemplate مطالعه کنید

این لینک ها رو ببین حتما
لینک 1 (http://msdn.microsoft.com/en-us/library/ms742521.aspx) (اگه لینک باز نشد توی همون پنجره یک بار روی آدرس اینتر کن)

لینک 2 (http://codingbandit.com/Blog/blog/wpf-data-templates-part-1-introduction-to-wpf-data-templates/)

لینک 3 (http://blah.winsmarts.com/2007-3-WPF__The_DataTemplate,_choosing_how_your_data_will _look_like.aspx)

لینک 4 (http://www.c-sharpcorner.com/uploadfile/mahesh/wpflistbox08252008100659am/wpflistbox.aspx)

لینک 5 (http://www.codeproject.com/KB/WPF/CustomListBoxLayoutInWPF.aspx)