2016-07-20 9 views
0

in einem Textblock erkannt, den ich einen Auslöser zum Steuern der Breite des Textblocks festlegen. Im Trigger möchte ich abfragen, ob die vertikale Bildlaufleiste der ListView ListViewA sichtbar ist. Aber die Bindung funktioniert nicht. Weder 'ScrollViewer.VerticalScrollBarVisibility' noch 'VerticalScrollBarVisibility' akzeptiert: Scroll "(oder" VerticalScrollBarVisibility „) in Datacontext des Typs 'System.Windows.Controls.Listview' "Can not Eigenschaft lösen" Was sollte ich ändernScrollViewer von einem ListView wird nicht in einem Trigger

.?

Alexander

<TextBlock> 
    <TextBlock.Style> 
    <Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Width" Value="453" /> 
     <Style.Triggers> 
      <!--Binding-Error!--> 
      <DataTrigger Binding="{Binding ScrollViewer.VerticalScrollBarVisibility, ElementName=ListViewA}" Value="Visible"> 
      <Setter Property="Width" Value="300" /> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </TextBlock.Style> 
</TextBlock> 

<ListView x:Name="ListViewA" ScrollViewer.VerticalScrollBarVisibility="Auto" /> 
+0

'ScrollViewer.VerticalScrollBarVisibility' ist eine angefügte Eigenschaft, sie benötigt '()' im Bindungspfad: '" {Binding (ScrollViewer.VerticalScrollBarVisibility), ElementName = ListViewA} "' – ASh

Antwort

0

ich kann es nicht atm testen, aber es sollte funktionieren, aber versuchen, diese

<Style TargetType="{x:Type TextBlock}"> 
    <Setter Property="Width" Value="453" /> 
    <Style.Triggers> 
     <!--Binding-Error!--> 
     <DataTrigger Binding="{Binding Path=(ScrollViewer.VerticalScrollBarVisibility), ElementName=ListViewA}" Value="Visible"> 
     <Setter Property="Width" Value="300" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Dies liegt daran, VerticalScrollBarVisibility Eigenschaft angebracht ist eher als Abhängigkeits prop bitter.

0

Drei Probleme hier:

Zuerst werden die ScrollViewer.* Eigenschaften Eigenschaften angebracht sind. Was Sie für eine Path in Ihrer Bindung haben, impliziert, dass TextBlock eine ScrollViewer Eigenschaft hat, die wiederum eine VerticalScrollBarVisibility Eigenschaft hat, aber das ist nicht das, was Sie überhaupt ausdrücken möchten. ScrollViewer. ist Teil des Namens der angehängten Eigenschaft und nicht ein zusätzliches Element des Eigenschaftspfads. Sie geben dies an, indem Sie ClassName.PropertyName in Parens setzen: {Binding (ClassName.PropertyName)}.

Zweitens ScrollViewer.VerticalScrollBarVisibility wird Auto, denn das ist, was Sie in einem Attribut festlegen. Wenn Sie den Laufzeitwert "live" haben möchten, müssen Sie eine andere Eigenschaft verwenden - genau wie Width vs ActualWidth. In diesem Fall ist ScrollViewer.ComputedVerticalScrollBarVisibility diejenige, die Sie möchten. Es kommt vor, dass diese Eigenschaft nicht die Art und Weise funktioniert man denken würde (das Problem drei, unten), aber wenn es so wäre, XAML würde wie folgt aussehen:

<DataTrigger 
    Binding="{Binding (ScrollViewer.ComputedVerticalScrollBarVisibility), ElementName=ListViewA}" 
    Value="Visible" 
    > 
    <Setter Property="Width" Value="300" /> 
    <Setter Property="Background" Value="DeepSkyBlue" /> 
</DataTrigger> 

Computed, Actual, Tomate, potahto. Niemand hat gesagt, dass es Sinn machen muss.

Die letzte und schlimmste Problem ist, dass die angefügten Eigenschaft ScrollViewer.ComputedVerticalScrollBarVisibility auf dem ListView ist sinnlos Müll. Es gibt immer Visible zurück. Du kannst das also nicht in XAML machen. Wir müssen einen Wertkonverter schreiben, der das tatsächliche Objekt ScrollViewer in der visuellen Struktur der ListView findet und eine seiner Eigenschaften zurückgibt.

public class GetVisualDescendantProperty : MarkupExtension, IValueConverter 
{ 
    public DependencyProperty Property { get; set; } 
    public Type Type { get; set; } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (value as DependencyObject) 
      ?.GetDescendants() 
      .Where(d => d.GetType() == Type) 
      .FirstOrDefault() 
      ?.GetValue(Property); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return this; 
    } 
} 

public static class Extensions 
{ 
    public static IEnumerable<DependencyObject> GetDescendants(this DependencyObject obj) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); ++i) 
     { 
      var child = VisualTreeHelper.GetChild(obj, i); 
      yield return child; 
      foreach (var descendant in child.GetDescendants()) 
      { 
       yield return descendant; 
      } 
     } 
    } 
} 

Und die XAML:

<DataTrigger 
    Binding="{Binding ElementName=ListViewA, Converter={local:GetVisualDescendantProperty Property=ScrollViewer.ComputedVerticalScrollBarVisibility, Type=ScrollViewer}}" 
    Value="Visible" 
    > 
    <Setter Property="Width" Value="300" /> 
    <Setter Property="Background" Value="DeepSkyBlue" /> 
</DataTrigger> 

Wir brauchen nicht die Pars um Property=ScrollViewer.ComputedVerticalScrollBarVisibility in der MarkupExtension Initialisierung, da diese Zeichenfolge nicht als PropertyPath analysiert werden wird. Da die Eigenschaft als public DependencyProperty Property deklariert ist, muss der XAML-Parser nicht versuchen zu erraten, was er sieht.

Verwandte Themen