如何在代码后面为DataTemplate子元素设置ValueConverter

时间:2018-01-10 14:04:43

标签: uwp datatemplate code-behind valueconverter

我想访问DataTemplate内的特定控件,并从 CodeBehind 设置ValueConverter

ValueConverter应该从使用页面/控件中传入

我的 MainPage 正在使用来自其他项目的 UserControls ,因为它们应该在我的大多数应用程序中使用。

UserControl看起来像这样:

<Grid>
    <ListView Name="SampleListView">
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Name="SampleGrid">
                    <TextBlock Name="SampleTextBox" Text="{Binding BindingProperty}" />
                    <TextBlock Name="TextBoxIWantToAccess" Foreground="{Binding SampleDateTime, Converter={StaticResource DateTimeToColorConverter}}"/>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</Grid>

所以我的建议是首先从代码后面访问它,但它没有用...

我试过这个: Binding(Converter) in Code Behind

结合这个: WPF How to access control from DataTemplate

但它无效

所以现在我的建议是我也可以在代码

中这样做
public MyUserControl1(IValueConverter converter)
    {
        this.InitializeComponent();
        this.Resources.Add("DateTimeToColorConverter", converter);
    }

但它没有用......

可能是... Converter={StaticResource DateTimeToColorConverter}}",不应将其指定为 StaticResource ,因为它来自 CodeBehind

但我尝试了很多组合而且没有用......

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

以下适用于我:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <ListView>
            <ListView.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}"
                               Foreground="{Binding Converter={StaticResource MyConverter}}" />
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </Grid>

在代码背后:

public MyUserControl1()
{
    this.Resources["MyConverter"] = new FooConverter();
    this.InitializeComponent();            
}

请注意,我在调用InitializeComponent()之前添加了资源。