簡體   English   中英

WPF從父元素綁定到子元素

[英]WPF binding from parent to child element

這是我的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>

這是代碼背后

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

我想做的是,每當itemsControl內的內部元素的布爾IsMissing為true時,我要確保StackPanel中的ComponentID和Name屬性(方向為水平)不會顯示在窗口中,包括子元素。 基本上,我正在嘗試尋找一種方法來排除其isMissing變量設置為true的特定ComponentID的整個描述。 有什么建議嗎?

您可以使用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>

具有IsInverted屬性的自定義BoolToVisibilityConverter

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

我注意到的一件事是,您沒有將屬性(例如“ isMissing ”)實現為DependencyProperty 您也不通過INotifyPropertyChanged使用屬性更改通知。

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

我會考慮向Component類添加一個屬性IsAnyParameterMissing

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}可能需要調整,具體取決於您可用的轉換器。 雖然應該是一個簡單的任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM