من در یکی از ستون های داخل دیتاگریدم یک کمبوباکس اضافه کردم , و میخوام به خصوصیات اون در Code behind دسترسی داشته باشم (دسترسی به کنترل های تو در تو ) مثل صدا زدن یک کنترل بر اساس اسمش .
یکی از دلایلی که نیاز دارم به این کار اینه که ویژگی SelectedIndex روی این کمبوباکس داخل دیتاگرید هم تغییر نمیکنه
من چه راه هایی رو امتحان کردم؟
XAML :
<Grid x:Name="mygrid">
<DataGrid x:Name="MainDataGrid">
<DataGrid.Columns>
<DataGridTextColumn Header="The Name :" Width="120" Binding="{Binding NAMES, UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}" />
<DataGridTemplateColumn Header="CMB" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox x:Name="ComboBox1"
SelectedValuePath="CODE"
DisplayMemberPath="NAMES"
IsTextSearchEnabled="True"
SelectedIndex="0"
IsEditable="False"
SelectionChanged="ComboBox1_SelectionChanged"
BorderBrush="#FFADEEB4" Background="{x:Null}" BorderThickness="1">
<ComboBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling"/>
</ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
CS:
//Finder
#region Kids
public static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj == null) return null;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = (child as T) ?? GetChildOfType<T>(child);
if (result != null) return result;
}
return null;
}
public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject
{
// Confirm parent and childName are valid.
if (parent == null) return null;
T foundChild = null;
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
// If the child is not of the request child type child
T childType = child as T;
if (childType == null)
{
// recursively drill down the tree
foundChild = FindChild<T>(child, childName);
// If the child is found, break so we do not overwrite the found child.
if (foundChild != null) break;
}
else if (!string.IsNullOrEmpty(childName))
{
var frameworkElement = child as FrameworkElement;
// If the child's name is set for search
if (frameworkElement != null && frameworkElement.Name == childName)
{
// if the child's name is of the request name
foundChild = (T)child;
break;
}
}
else
{
// child element found.
foundChild = (T)child;
break;
}
}
return foundChild;
}
private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(obj, i);
if (child != null && child is childItem)
{
return (childItem)child;
}
else
{
childItem childOfChild = FindVisualChild<childItem>(child);
if (childOfChild != null)
return childOfChild;
}
}
return null;
}
#endregion
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var Test0 = this.FindName("ComboBox1");
var Test1 = mygrid.Children.OfType<ComboBox>().FirstOrDefault();
var Test2 = GetChildOfType<ComboBox>(mygrid);
var Test3 = FindChild<ComboBox>(Application.Current.MainWindow, "ComboBox1");
}
تمام اون Test ها از 0 تا 3 همشون Null هستن در تست نهایی !
لطفا راهنمایی بفرمایید
ممنون از توجه شما
دوستان این فانکشن جواب هست اما من متوجه شدم اصلا نیازی نیست از این کار استفاده کرد اگر شما از بایندینگ استفاده کنید:
public class UISOME
{
public static DependencyObject FindChild(DependencyObject parent, Func<DependencyObject, bool> predicate)
{
if (parent == null) return null;
int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childrenCount; i++)
{
var child = VisualTreeHelper.GetChild(parent, i);
if (predicate(child))
{
return child;
}
else
{
var foundChild = FindChild(child, predicate);
if (foundChild != null)
return foundChild;
}
}
return null;
}
}
تاریخ :
1402/10/30
- ساعت :
05:11:00 PM
- بازدید :
309
- پاسخ :
1
|
تاریخ :
1402/09/20
- ساعت :
03:39:00 PM
- بازدید :
436
- پاسخ :
2
|
تاریخ :
1402/09/06
- ساعت :
03:03:00 PM
- بازدید :
389
- پاسخ :
1
|
تاریخ :
1402/10/06
- ساعت :
01:28:00 AM
- بازدید :
424
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
290
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
584
- پاسخ :
1
|
تاریخ :
1398/07/25
- ساعت :
09:37:00 PM
- بازدید :
3378
- پاسخ :
5
|
تاریخ :
1402/08/12
- ساعت :
11:51:00 PM
- بازدید :
436
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
09:43:00 PM
- بازدید :
2989
- پاسخ :
2
|
تاریخ :
1398/09/17
- ساعت :
12:33:00 AM
- بازدید :
5317
- پاسخ :
2
|
تاریخ :
1402/12/13
- ساعت :
05:04:00 PM
- بازدید :
199
- پاسخ :
0
|
تاریخ :
1401/11/15
- ساعت :
11:17:00 AM
- بازدید :
1057
- پاسخ :
1
|
تاریخ :
1402/12/25
- ساعت :
03:38:00 PM
- بازدید :
107
- پاسخ :
0
|
تاریخ :
1403/01/06
- ساعت :
05:14:00 PM
- بازدید :
74
- پاسخ :
1
|
تاریخ :
1403/01/07
- ساعت :
01:45:00 AM
- بازدید :
45
- پاسخ :
0
|
تاریخ :
1398/07/19
- ساعت :
11:16:00 PM
- بازدید :
2952
- پاسخ :
2
|
تاریخ :
1398/08/21
- ساعت :
03:45:00 AM
- بازدید :
2291
- پاسخ :
1
|
تاریخ :
1398/08/06
- ساعت :
03:57:00 PM
- بازدید :
7293
- پاسخ :
2
|
تاریخ :
1402/12/12
- ساعت :
03:20:00 PM
- بازدید :
86
- پاسخ :
1
|
تاریخ :
1402/12/10
- ساعت :
03:35:00 PM
- بازدید :
114
- پاسخ :
1
|