关于获取silverlight的datagrid子控件属性的问题 50

在后台文件中如何获取DataGrid里面的DatePicker的IsEnabled属性。望silverlight高手解惑!!... 在后台文件中如何获取 DataGrid 里面的 DatePicker 的 IsEnabled属性。
望silverlight高手解惑!!
展开
 我来答
赤水云
推荐于2016-09-04 · TA获得超过5029个赞
知道大有可为答主
回答量:2362
采纳率:86%
帮助的人:904万
展开全部
在Silverlight项目开发中,经常会把一个独立功能的控件封装成一个UserControl,然后供其他页面或者控件进行调用。前一段时间,在项目中遇到一个问题,需要在同一个页面重复调用多个相同的UserControl控件,然后在父页面中控制这些重复生成的子控件。由于很多控件是动态生成,数量也是动态控制,所以所有的操作都需要使用后台代码进行实现。

在上面的需求中需要用到Silverlight API中的VisualTreeHelper类,对于VisualTreeHelper类,有不少文章已经介绍过,该类可以对Silverlight可视化树进行遍历,该可视化树是逻辑对象树的一个子集。我们可以通过VisualTreeHelper提供的方法GetChild(),GetParent()和GetChildrenCount(),分别获取子控件,父控件以及子控件数量。

在实际项目中,为满足实际开发需求,对VisualTreeHelper的方法重新进行封装是非常必要的。

首先要介绍的Hleper方法是GetParentObject方法,获取父控件方法。该方法将根据当前控件,遍历查找其父控件是否存在。参数1是表示当前子控件名,参数2是要查询父控件名;使用VisualTreeHelper.GetParent方法获取当前父控件。

1 public T GetParentObject<T>(DependencyObject obj, string name) where T : FrameworkElement
2 {
3 DependencyObject parent = VisualTreeHelper.GetParent(obj);
4
5 while (parent != null)
6 {
7 if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
8 {
9 return (T)parent;
10 }
11
12 parent = VisualTreeHelper.GetParent(parent);
13 }
14
15 return null;
16 }
17

另外一个Helper方法是GetChildObject,获取子控件方法。该方法将根据当前控件,遍历查找其子控件是否存在。参数1是表示当前父控件名,参数2是要查询子控件名;

1 public T GetChildObject<T>(DependencyObject obj, string name) where T : FrameworkElement
2 {
3 DependencyObject child = null;
4 T grandChild = null;
5
6 for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
7 {
8 child = VisualTreeHelper.GetChild(obj, i);
9
10 if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
11 {
12 return (T)child;
13 }
14 else
15 {
16 grandChild = GetChildObject<T>(child, name);
17 if (grandChild != null)
18 return grandChild;
19 }
20 }
21
22 return null;
23
24 }

最后介绍一个Helper方法是GetChildObjects方法,该方法将把所有子控件作为List集合返回到客户端。其中第一个参数是父控件参数,而第二个参数是特定子控件名称,如果需要遍历全部子控件,第二个参数留空即可。

1 public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
2 {
3 DependencyObject child = null;
4 List<T> childList = new List<T>();
5
6 for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
7 {
8 child = VisualTreeHelper.GetChild(obj, i);
9
10 if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
11 {
12 childList.Add((T)child);
13 }
14
15 childList.AddRange(GetChildObjects<T>(child,""));
16 }
17
18 return childList;
19
20 }
收破烂的小度
2015-07-11 · TA获得超过510个赞
知道小有建树答主
回答量:393
采纳率:0%
帮助的人:278万
展开全部
两种方法

----------------------------------------xaml页面---------------------------------

<Grid x:Name="LayoutRoot" Background="White">
<sdk:DataGrid AutoGenerateColumns="False" HorizontalAlignment="Left" Name="dg" Height="106" VerticalAlignment="Top" Width="390" >
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="DPk列数据">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<sdk:DatePicker Text="{Binding A1}" IsEnabled="{Binding A2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
<sdk:DataGridCheckBoxColumn Header="改变DPKIsEnabled" Binding="{Binding A2,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
</sdk:DataGrid.Columns>
</sdk:DataGrid>
<Button Content="第一种方式" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click" Margin="0,127,0,0"/>
<Button Content="第二种方式" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Click="Button_Click_1" Margin="88,127,0,0"/>
</Grid>

-------------------------------cs----------------------------------------

public partial class MainPage : UserControl
{
List<A> lst_a;
public MainPage()
{
InitializeComponent();
A a = new A();
lst_a = new List<A>() { new A() { A1 = DateTime.Now, A2 = false } };
dg.ItemsSource = lst_a;
}
//第一种
private void Button_Click(object sender, RoutedEventArgs e)
{
foreach (A a in lst_a)
{
DatePicker dpker = dg.Columns[0].GetCellContent(a) as DatePicker;
MessageBox.Show(dpker.IsEnabled.ToString());
}
}
//第二种
private void Button_Click_1(object sender, RoutedEventArgs e)
{
foreach (A a in lst_a)
{
MessageBox.Show(a.A2.ToString());
}
}
}
public class A : System.ComponentModel.INotifyPropertyChanged
{
DateTime _a1;
public DateTime A1
{
get { return _a1; }
set { _a1 = value; }
}
bool _a2;

public bool A2
{
get { return _a2; }
set
{
_a2 = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("A2"));
}
}
}

public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式