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.
'ScrollViewer.VerticalScrollBarVisibility' ist eine angefügte Eigenschaft, sie benötigt '()' im Bindungspfad: '" {Binding (ScrollViewer.VerticalScrollBarVisibility), ElementName = ListViewA} "' – ASh