【问题标题】:WPF ValueConverter Binding - Something's WrongWPF ValueConverter 绑定 - 出了点问题
【发布时间】:2011-03-08 17:06:22
【问题描述】:

假设您有一个用户选择列表。根据用户所做的选择,其他选择可能不再可用。

我有一个 ValueConverter 可以处理这个问题。如果它知道进行了哪些选择,它将返回一个值,指示正在转换的项目是否仍然可选择。

问题是知道用户选择的唯一地方是在这个屏幕的 ViewModel 中。没问题,我虽然。我将使转换器成为 ViewModel 上的一个属性,并在转换器的构造函数中传递对 ViewModel 的引用,以便转换器可以随时检查所选项目的列表。

我现在遇到的问题是它似乎实际上并没有执行任何转换。

归结为: ViewModel 有一个名为 MySelectionConverter 的 IValueConverter 类型的属性。 ViewModel 有一个选定项目的列表。 在视图(继承自 UserControl 的 MyScreen 类型)中,有一个包含项目的列表框。

ItemTemplate 看起来像这样:

<ListBox.ItemTemplate>
    <DataTemplate>
        <Grid Height="Auto" Width="100" VerticalAlignment="Top"  Visibility="{Binding Path=DataContext.MySelectionConverter, RelativeSource={RelativeSource AncestorType={x:Type MyScreen}}}">
            <TextBlock Text="The user might want to select me." />
        </Grid>
    </DataTemplate>
</ListBox.ItemTemplate>

我怀疑我的绑定有问题。但也许你根本无法做到这一点。任何帮助表示赞赏。

编辑: 根据我到目前为止获得的信息,我的绑定不正确。但事实证明,我不能做我想做的事。本质上,我试图通过 Binding 设置转换器:

Visibility="{Binding Converter={Binding Path=DataContext.StyleOptionConverter, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:StyleSelectionScreen}}}}

Visual Studio 告诉我:

无法在 类型的“转换器”属性 '捆绑'。只能设置“绑定” 在一个 DependencyProperty 上 依赖对象。

所以,现在我想问题变成了:我可以通过什么方式解决这个问题?我需要有一个转换器,它知道将在其中使用的屏幕的 ViewModel 的状态。

【问题讨论】:

    标签: wpf mvvm binding ivalueconverter


    【解决方案1】:

    您的绑定错误。转换器是绑定的属性,不在路径属性内

    这是我的一个项目中的一些示例代码:

    <local:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
    

    以下:

    <DataGrid ItemsSource="{Binding Path=Tracks, IsAsync=True}" AutoGenerateColumns="False" Height="130" HorizontalAlignment="Left" Name="dataGrid2" 
                                      Visibility="{Binding Path=ShowSongs, Converter={StaticResource BooleanToVisibilityConverter}, Mode=TwoWay}" GridLinesVisibility="Vertical" 
                                      AlternatingRowBackground="{StaticResource Background}">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="Song" Width="*" Binding="{Binding Name}" />
                                    <DataGridTextColumn Header="Artist"  Width="*" Binding="{Binding Artist}" />
                                    <DataGridTextColumn Header="Album" Width="*" Binding="{Binding Album}" />
                                </DataGrid.Columns>
                            </DataGrid>
    

    转换器是与视图模型在同一命名空间中的类

    public class BooleanToVisibilityConverter : IValueConverter
    {
    
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (true.Equals(value)) ? Visibility.Visible : Visibility.Hidden;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    【讨论】:

      【解决方案2】:

      原来我真正需要的是 MultiBinding 和 IMultiValueConverter。

      XAML 最终看起来像这样:

      <Grid.Visibility>
          <MultiBinding Converter="{StaticResource styleOptionConverter}">
              <Binding />
              <Binding ElementName="UserControl" Path="DataContext" />
          </MultiBinding>
      </Grid.Visibility>
      

      虽然,无可否认,我宁愿使用 RelativeSource 而不是 ElementName,但现在这足以让我继续前进。

      如果有人碰巧知道如何绑定:

      {Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:StyleSelectionScreen}}}
      

      应该看看写在MultiBinding的时候,我都听好了!否则,我猜这个已经关闭了。

      【讨论】:

        猜你喜欢
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多