دسترسی به کنترل های فرزند (تو در تو) در 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 هستن در تست نهایی !
لطفا راهنمایی بفرمایید
ممنون از توجه شما
پاسخ هوش مصنوعی
برای دسترسی به کنترل های فرزند تو در تو در DataGrid
در WPF، شما باید از متدهای مناسب برای پیمایش در درخت بصری استفاده کنید. با توجه به کدی که ارایه داده اید، متد FindChild
می تواند به شما کمک کند تا به ComboBox
در هر ردیف دسترسی پیدا کنید.
در اینجا نحوه استفاده از FindChild
برای دسترسی به ComboBox
در یک ردیف مشخص از DataGrid
آمده است:
private void GetComboBoxFromDataGrid()
{
// فرض می کنیم شما به ردیف اول دسترسی دارید
var row = (DataGridRow)MainDataGrid.ItemContainerGenerator.ContainerFromIndex(0);
if (row != null)
{
var comboBox = FindChild<ComboBox>(row, "ComboBox1");
if (comboBox != null)
{
// می توانید به خصوصیات ComboBox دسترسی پیدا کنید
comboBox.SelectedIndex = 1; // به عنوان مثال، Index را تغییر دهید
}
}
}
شما باید این متد را در هنگام بارگذاری ویندوز یا در یک رویداد مناسب دیگر صدا بزنید تا به ComboBox
دسترسی پیدا کنید.
از طرف دیگر، مطمین شوید که ComboBox
در DataTemplate
درست نامگذاری شده است و DataGrid
شما به درستی بارگذاری شده است. اگر ComboBox
در حال عدم اینستانس سازی است، سعی کنید تا اطمینان حاصل کنید که DataGrid
بارگذاری شده و ردیف ها به درستی ایجاد شده اند.
امیدوارم این اطلاعات به شما کمک کند تا به کنترل های مورد نیاز در DataGrid
دسترسی پیدا کنید.
دوستان این فانکشن جواب هست اما من متوجه شدم اصلا نیازی نیست از این کار استفاده کرد اگر شما از بایندینگ استفاده کنید:
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;
}
}
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول