从父元素到子元素的WPF绑定

时间:2013-10-21 11:39:52

标签: c# .net wpf xaml wpf-controls

这是我的XAML

 <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>

这是CodeBehind

  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属性(具有水平方向)未显示在包含子元素的窗口。基本上我试图找到一种方法来排除isMissing变量设置为true的特定ComponentID的整个描述。对此有何建议?

3 个答案:

答案 0 :(得分: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>

自定义BoolToVisibilityConverter IsInverted属性:

[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示例以使用它。

答案 1 :(得分:1)

我注意到的一件事是你没有将属性(例如“ isMissing ”)实现为 DependencyProperty 。您也没有通过 INotifyPropertyChanged 使用属性更改通知。

您必须实现两者中的任何一个,否则属性的更改将不会通过绑定传播。这意味着触发器不会触发......

答案 2 :(得分: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>

如果集合中的任何StackPanel的{​​{1}}属性等于Parameter,则只显示IsMissing。请注意,如果为任何项目更改true属性,则不会更改可见性!这需要一些额外的工作。

编辑:请注意,可能需要调整IsMissing,具体取决于您可用的转换器。应该是一项简单的任务。