Wpf 从转换器内部访问逻辑树

Wpf 从转换器内部访问逻辑树,wpf,Wpf,我需要访问转换器内的逻辑树。实际上,这是在一个UserControl中,我认为只有在这个UserControl可以在我的应用程序中存在多次的情况下,它才是相关的 我找到了一个解决方案,但这是一个相当粗糙的解决方案,我的问题是:有没有更好、更优雅的解决方案 这就是我所做的。我在转换器中添加了一个任意控件锚作为属性。使用该控件,我可以访问逻辑树。在本例中,我从封闭网格中获取Tag属性,并相应地转换该值 public class SomeConverter : IValueConverter {

我需要访问转换器内的逻辑树。实际上,这是在一个UserControl中,我认为只有在这个UserControl可以在我的应用程序中存在多次的情况下,它才是相关的

我找到了一个解决方案,但这是一个相当粗糙的解决方案,我的问题是:有没有更好、更优雅的解决方案

这就是我所做的。我在转换器中添加了一个任意控件锚作为属性。使用该控件,我可以访问逻辑树。在本例中,我从封闭网格中获取Tag属性,并相应地转换该值

public class SomeConverter : IValueConverter
{
    public System.Windows.Controls.Control Anchor { get; set; }

    public object Convert(object value, Type t, object parameter, CultureInfo culture)
    {
        return toUpper() ? value.ToString().ToUpper() : value;
    }
    public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
    {
        return value;
    }
    private bool toUpper()
    {
        string tag = (Anchor.Parent as Grid).Tag as string;
        return ! String.IsNullOrEmpty(tag);    
    }
}
到目前为止还不错。真正难看的部分是我如何将控件分配给属性。我创建一个空ContentControl并将其分配给转换器定义。为了使ContontControl位于逻辑树中,我还需要实例化某个地方,这是我使用Visibility=hidden完成的。以下是XAML:

<Window x:Class="WpfApp4__Various_Tests_.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApp4__Various_Tests_"
    Title="MainWindow" Height="100" Width="300">
<Window.Resources>
    <ContentControl x:Key="anchor" Visibility="Hidden"/>
</Window.Resources>
<Grid Tag="toUpper">
    <Grid.Resources>
        <local:SomeConverter x:Key="SomeConverter" Anchor="{StaticResource anchor}"/>
    </Grid.Resources>
    <StaticResource ResourceKey="anchor" />
    <TextBox
        x:Name="textBox"
        Text="{Binding SomeProperty, Converter={StaticResource SomeConverter}}"
        />
</Grid>

您可以尝试将多重绑定与IMultiValueConverter一起使用。在那里,您可以使用绑定传递目标元素

现在还不清楚你为什么要这样做,而这正是你真正想要实现的。为什么需要逻辑树。看起来无论你想做什么,你都在过度复杂化。这很可能是。我有一个带有TabItems的TabControl。我想使TabItem中元素的可见性取决于TabControl中的属性。但是,这就是所选项目的捕获。我的想法是在converter.ItemTemplate和触发器中进行区分。TabItem有一个属性IsSelected。更少的代码。最好读一读。