2013-10-21 19 views
0

這是我的XAMLWPF從父到子元件結合

<ListView x:Name="missingVariablesListView" ScrollViewer.CanContentScroll="True" HorizontalAlignment="Left" Height="320" Margin="81,28,0,0" VerticalAlignment="Top" Width="641" ItemsSource="{Binding}"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Vertical"> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="ComponentID: " FontWeight="Bold" Foreground="Brown" /> 
           <TextBlock Text="{Binding Name}"/> 
          </StackPanel> 
          <ItemsControl ItemsSource="{Binding Parameters}"> 
           <ItemsControl.ItemTemplate> 
            <DataTemplate> 
             <StackPanel> 
              <StackPanel Orientation="Horizontal"> 
               <TextBlock Text="Variable Name: " Foreground="Green"/> 
               <TextBlock Text="{Binding Name}"/> 
               <TextBlock Text=" "/>           
               <TextBlock Text="Variable Value: " Foreground="Blue"/> 
               <TextBlock Text="{Binding Value}"/> 
              </StackPanel> 
             </StackPanel> 
            </DataTemplate> 
           </ItemsControl.ItemTemplate> 
           <ItemsControl.ItemContainerStyle> 
            <Style > 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding IsMissing}" Value="false"> 
               <Setter Property="UIElement.Visibility" Value="Collapsed"/>              
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </ItemsControl.ItemContainerStyle> 
          </ItemsControl>       
           <TextBlock Text="-----------------------------------------------------------------"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 

這裏是代碼隱藏

this.missingVariablesListView.DataContext = //Code to fill in the list View 

類涉及

public class Component 
    { 
    private ObservableCollection<ComponentParameter> parameters = new ObservableCollection<ComponentParameter>(); 
    public string Name 
    { 
    get; 
    set; 
    } 

    public ObservableCollection<ComponentParameter> Parameters 
    { 
    get{return parameters;} 
    set{parameters = value;} 
    } 
} 



public class ComponentParameter 
{ 
    public string Name 
    { 
    get;set; 
    } 

    public string Value 
    { 
    get;set; 
    } 

    public bool HasErrors 
    { 
    get; 
    set; 
    } 

    public bool IsMissing 
    { 
    get;set; 
    } 

示例輸出(目前)

ComponentID: Component1 
-------------------------- 

ComponentID: Component2 
VariableName:Var1 Variable Value:Val1 
VariableName:Var2 Variable Value:Val2 
----------------------- 

ComponentID: Component3 
----------------------- 

ComponentID: Component4 
----------------------- 

我想要做的是,只要布爾IsMissing爲itemsControl中的內部元素爲真,我想確保StackPanel中的ComponentID和Name屬性(具有水平方向)不顯示在該窗口包含子元素。基本上我試圖找到一種方法來排除整個描述爲特定的ComponentID,其isMissing變量設置爲true。對此有何建議?

+1

您的'ItemsControl'中可能有多個項目,那麼您要檢查它的'IsMissing'屬性? – gehho

+0

嗨@Gehho是的,有多個項目,我想檢查該ItemsControl內的所有項目。只要IsMissing對於我想要將其排除在顯示給用戶的所有項目都是假的。我只顯示將isMissing設置爲true的項目。 – Sike12

+0

@ elgonzo我將這個對象封裝爲observationCollection,所以這些事情應該在幕後隱含地完成。謝謝你讓我知道 – Sike12

回答

1

我會考慮到財產IsAnyParameterMissing添加到Component類:

public class Component 
{ 
    private ObservableCollection<ComponentParameter> parameters = new ObservableCollection<ComponentParameter>(); 
    public string Name 
    { 
     get; 
     set; 
    } 

    public ObservableCollection<ComponentParameter> Parameters 
    { 
     get{return parameters;} 
     set{parameters = value;} 
    } 

    public bool IsAnyParameterMissing 
    { 
     get { return this.Parameters.Any(param => param.IsMissing); } 
    } 
} 

然後能見度綁定到這個屬性:

<StackPanel Orientation="Horizontal" Visibility="{Binding IsAnyParameterMissing, Converter={BooleanToVisibilityConverter}}"> 
    <TextBlock Text="ComponentID: " FontWeight="Bold" Foreground="Brown" /> 
    <TextBlock Text="{Binding Name}"/> 
</StackPanel> 

如果集合中的任何ParameterIsMissing屬性等於true,則這將僅顯示StackPanel。請注意,如果任何項目的IsMissing屬性發生更改,這不會改變可見性!這需要一些額外的工作。

編輯:請注意,{BooleanToVisibilityConverter}可能需要調整,具體取決於您可用的轉換器。應該是一個簡單的任務。

+0

謝謝我會考慮它 – Sike12

+0

是啊這似乎與外面的財產工作。謝謝gehho – Sike12

1

你可以使用一個BooleanToVisibilityConverter隱藏你的項目,雖然你可能需要改變你的財產或添加這個新IsPresent屬性:

Resources

<Converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" 
    IsInverted="True" /> 

在您的ListView.ItemTemplate

<StackPanel Orientation="Horizontal" Visibility="{Binding IsMissing, Converter={ 
    StaticResource BoolToVisibilityConverter}}"> 
    <TextBlock Text="ComponentID: " FontWeight="Bold" Foreground="Brown" /> 
    <TextBlock Text="{Binding Name}"/> 
</StackPanel> 

自定義BoolToVisibilityConverterIsInverted屬性:

[ValueConversion(typeof(bool), typeof(Visibility))] 
public class BoolToVisibilityConverter : IValueConverter 
{ 
    public bool IsInverted { get; set; } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null || value.GetType() != typeof(bool)) return null; 
     bool boolValue = IsInverted ? !(bool)value : (bool)value; 
     return boolValue ? Visibility.Visible : Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (value == null || value.GetType() != typeof(Visibility)) return null; 
     if (IsInverted) return (Visibility)value != Visibility.Visible; 
     return (Visibility)value == Visibility.Visible; 
    } 
} 

現在它只會帶你一分鐘,以實現它。我更新了上面的XAML示例以使用它。

+0

@ sheridian ....轉換器標記是否像這樣引用它? xmlns:converter =「clr-namespace:Microsoft.TeamFoundation.Controls.WPF.Converters; assembly = Microsoft.TeamFoundation.Controls」 – Sike12

+1

抱歉@ Sike12,我在自定義轉換器和現在包含在.NET中的轉換器混淆了...你應該能夠在不添加XML名稱空間的情況下使用該轉換器: Sheridan

+0

我們可以通過將IsMissing而不是IsPresent來實現嗎? – Sike12

1

一兩件事我注意到的是,你不執行性質(如「ISMISSING」)作爲的DependencyProperty。您也不通過INotifyPropertyChanged使用財產變更通知。

您必須實現兩者之一,否則屬性的更改將不會通過綁定傳播。這意味着,該觸發器將不會觸發...

+0

@Elogonzo謝謝你似乎有有些工作要做。謝謝:) – Sike12