2010-03-22 75 views
1

我有一個ItemsControl與已定義的DataTemplate。我的ItemsControl定義如下所示:Silverlight + ItemsControl +獲取控件屬性值

<ItemsControl x:Name="myItemsControl" ItemsSource="{Binding}"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
     <CheckBox x:Name="myCheckBox" Content="{Binding Name}" /> 
     </Grid> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

這是我的DataTemplate的簡化版本。無論如何,當用戶點擊頁面上的按鈕時,我想遍歷myItemsControl中的項目並確定是否選中與該項目關聯的CheckBox元素。

如何確定CheckBox是否在ItemsControl中的特定項目中被選中?

謝謝!

回答

1

將屬性添加到您的數據類並對其進行數據綁定,然後迭代集合本身。

public class myDataClass 
{ 
    public string Name { get; set;} 
    public bool IsSomething { get; set; } 
}  

<CheckBox x:Name="myCheckBox" Content="{Binding Name}" IsChecked="{Binding IsChecked, Mode=TwoWay}" /> 
+0

沒有辦法實際獲得CheckBox而不是數據源本身嗎?我需要更改一些UI顏色等。這就是我試圖訪問CheckBox的原因。 – Villager 2010-03-22 00:48:40

+0

總有辦法。但是,在ItemsControl中手動處理可視化項目是最糟糕的做法。如果您需要項目響應數據更改,請考慮將其封裝在UserControls中,並使用VisualStateManager狀態響應這些數據更改。 – JustinAngel 2010-03-22 22:39:16

0

你可以嘗試像傳統的迭代:

public bool? TestMyCheckbox(string bindingName) 
{ 
    foreach (var item in myItemsControl.Items) 
    { 
     if (item.GetType() == typeof(CheckBox)) 
     { 
      var checkbox = (CheckBox)item; 
      if (checkbox.Content.Equals(bindingName)) 
      { 
       return (checkbox.IsChecked); 
      } 
     } 
    } 
    return null; 
} 

Additionaly(這可以更好地滿足您的需求),你可以尋找那些被選中的複選框綁定列表:

public IEnumerable<object> TestMyCheckboxes(ItemsControl control) 
{ 
    return from Control x in control.Items 
      where x.GetType().Equals(typeof(CheckBox)) && ((CheckBox)x).IsChecked == true 
      select ((CheckBox)x).Content; 
}