【问题标题】:Visibility binding not working on different PC's可见性绑定在不同的 PC 上不起作用
【发布时间】:2014-03-19 20:00:57
【问题描述】:

我在 DataGrid 的 DataTemplate 中遇到了可见性绑定问题。

我的可见性绑定是

Visibility="{Binding ElementName=Hauptfenster, Path=Test.IsAdmin, Converter={StaticResource TestConvert}}"

我添加了一个显示 IsAdmin 值的文本框:

<TextBlock Text="Visible or Not" Width="150" Height="30" Visibility="{Binding ElementName=Hauptfenster, Path=Test.IsAdmin, Converter={StaticResource TestConvert}}" HorizontalAlignment="Right" />

以及一个可见或不可见的TextBlock

<TextBlock Text="Visible or Not" Width="150" Height="30" Visibility="{Binding ElementName=Hauptfenster, Path=Test.IsAdmin, Converter={StaticResource TestConvert}}" HorizontalAlignment="Right" />

在另一台机器上,两个 TextBlock 元素正在正确更改它们的值(true/false 或 Visible/Collapsed)。只有数据网格中的复选框不会更改它:( 为什么?

整个 XAML:

<Window x:Class="BindingTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    x:Name="Hauptfenster">
<Window.Resources>
    <BooleanToVisibilityConverter x:Key="TestConvert" />
</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="20*"/>
        <RowDefinition Height="87*"/>
    </Grid.RowDefinitions>

    <ToggleButton Content="TestButton" Width="150" Height="30" Click="ToggleButton_Click" />

    <TextBlock Text="Visible or Not" Width="150" Height="30" Visibility="{Binding ElementName=Hauptfenster, Path=Test.IsAdmin, Converter={StaticResource TestConvert}}" HorizontalAlignment="Right" />

    <TextBlock Text="{Binding ElementName=Hauptfenster, Path=Test.IsAdmin}" Width="100" Height="20" HorizontalAlignment="Left"  />

    <DataGrid x:Name="dgTest" Grid.Row="1">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Spalte 1">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <CheckBox Content="Test" Visibility="{Binding ElementName=Hauptfenster, Path=Test.IsAdmin, Converter={StaticResource TestConvert}}" />
                            <TextBlock Text="{Binding Spalte1}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTemplateColumn Header="Spalte 2">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <CheckBox Content="Test" />
                            <TextBlock Text="{Binding Spalte2}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Spalte 3" Binding="{Binding Spalte3}" />
        </DataGrid.Columns>
    </DataGrid>
</Grid>

转换器:

public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return ((bool)value == true) ? Visibility.Visible : Visibility.Collapsed;
    }

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

如果“IsAdmin”属性为假,则应折叠复选框(或其他)。它在我的机器(.NET 4.5.1)上运行良好,但如果我在另一台安装了 .NET 4.0 的机器上尝试它,它就不起作用。该项目的目标框架是 .NET 4.0。

我做错了什么?这是一个 .NET 错误吗?有任何想法吗?谢谢!

【问题讨论】:

  • 在您的 TestConvert 中运行调试。验证输入的内容。
  • 我猜IsAdmin 在另一台机器上是假的。验证转换器中IsAdmin 的值,然后在您认为应该为真时回溯以查看为什么它为假。
  • 也许你在另一台机器上部署了不同的配置?
  • 我认为 在 .net 4.5 中得到了重大改进,这就是 ElementName Binding 起作用的原因。在 .net 4.0 中,DataGrid.Columns 经常丢失 LogicalTree,因此无法正确创建 Binding。但是,为了确保它在两个 .net 世界中都能正常工作,您可以将绑定源设置为 x:reference Hauptfenster :)
  • 谢谢,这就是解决方案! &lt;CheckBox Content="Test" Visibility="{Binding Source={x:Reference Hauptfenster}, Path=Test.IsAdmin, Converter={StaticResource TestConvert}}" /&gt; 现在它就像一个魅力!

标签: c# wpf binding visibility datatemplate


【解决方案1】:

谢谢,这就是解决方案!

<CheckBox Content="Test" Visibility="{Binding Source={x:Reference Hauptfenster}, Path=Test.IsAdmin, Converter={StaticResource TestConvert}}" />

现在它就像一个魅力!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2017-11-09
    • 2017-04-19
    • 1970-01-01
    • 2014-09-05
    • 2016-10-06
    相关资源
    最近更新 更多