2013-10-09 37 views
0

我有一個有許多列表框和所有除了最後一個應該有背景可見的堆疊面板。是否有可能從控件模板檢測列表框是最後一個孩子,並設置「BD」不透明度爲0(MyListBox擴展列表框)檢測是最後一個孩子控制和更改一個屬性

<Style TargetType="{x:Type local:MyListBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:MyListBox}"> 
      <Grid > 
      ... 
       <Border Grid.Row="0" x:Name="Bd"...> 
        <Border.Background> 
         <ImageBrush Stretch="Fill" ImageSource="/arrayProba1;component/bck/mybck.png" /> 
        </Border.Background> 

如果我添加另一個列表框,老的一個,這在以前最後一個孩子將獲得背景和新的一個將失去它設置爲「BD」不透明度0(將在後面的動畫)

private List<MyListBox> MyPanels = new List<MyListBox>(); 

MyPanels.Add(new MyListBox() { Title = "..." }); 
MyPanelsHolder.Children.Add(MyPanels[n]); 

我是有工作在代碼中創建的整體風格背後,但我需要做的是這樣的。 你會如何解決這個問題?

+2

我會在我的對象創建BD Color屬性,設置的最後一個項目透明,並簡單地將它綁定。我儘量避免直接操作Items Control/List Box項目。 – Tony

+0

你的意思是在MyListBox類中創建bool MyOpacity DependencyProperty,然後在Bd中綁定Opacity =「{TemplateBinding MyOpacity}」?這樣,我添加新的MyListBox後,我可以遍歷MyPanels並將MyOpacity全部設置爲0,並將最後一個設置爲1.這似乎是一個好主意,是您的意思? – Daniel

+1

是的。始終preffer具有屬性並將它們設置在代碼後面的對象屬性中。然後將它們綁定到XAML上,或使用WPF觸發器。然後,在您的類上使用INotifyPropertyChanged,可以在用戶界面中看到更改。 – Tony

回答

0

感謝託尼這怎麼我做它到底... 這條邊界現在是

<Border Visibility="{TemplateBinding IsNotCurrent, Converter={StaticResource BoolToVis}}"> 
    <Border.Background> 
    <ImageBrush Stretch="Fill" ImageSource="/arrayProba1;component/Bck/MyBck.png" /> 

而在MyListBox I類有:

public static readonly DependencyProperty IsNotCurrentProperty = 
    DependencyProperty.Register("IsNotCurrent", typeof(bool), 
    typeof(MyListBox), new FrameworkPropertyMetadata(false)); 

public bool IsNotCurrent 
{ 
    get { return (bool)GetValue(IsNotCurrentProperty); } 
    set { SetValue(IsNotCurrentProperty, value); } 
} 

所以每次我添加或刪除一個列表框我設置所有MyPanels [i] .IsNotCurrent = true;並將最後一個設置爲'false'。

我可能這一切後來改爲肯定的版本(而不是IsNotCurrent到isLast會)

相關問題