دسته بندی ها
13:42 1401/06/06
دسترسی به کنترل های فرزند (تو در تو) در DataGrid در WPF
من در یکی از ستون های داخل دیتاگریدم یک کمبوباکس اضافه کردم , و میخوام به خصوصیات اون در 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 هستن در تست نهایی !
لطفا راهنمایی بفرمایید
ممنون از توجه شما
ویرایش شده در یکشنبه 6 شهریور 1401 ساعت 19:24:38
مشخصات سوال کننده :
کاربر : mojtabahakimian
امتیاز کاربر : 155
رتبه کاربر : 10
به این سوال امتیاز بدهید
0
تعداد بازدید این سوال : 1910
1 نظر
fateme :
با توجه به اینکه سوالتون تخصصی WPF هست و اینکه کدهایی که قرار دادید هم زیاده و تست کردن سخته در این موارد بهتره یک سورس سمپل که بدون اشکال کار کنه رو قرار بدید تا افرادی که قصد پاسخ دادن دارن سورس شما رو دانلود کنن و مستقیم روی سورس کار کنن. الان این کدها رو باید تست کرد ولی نمونه ای نیست که بشه تست کرد.
امتیاز کاربر : 1617
رتبه کاربر : 2
تاریخ ثبت : 02:06 1401/06/07
پاسخ دهنده : mojtabahakimian
15:32 1401/06/07
دوستان این فانکشن جواب هست اما من متوجه شدم اصلا نیازی نیست از این کار استفاده کرد اگر شما از بایندینگ استفاده کنید:
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;
}
}
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.
 
ورود