2011-03-08 34 views
3

想象一下你有一个用户选择列表。根据用户的选择,其他选择可能不再可用。WPF ValueConverter Binding - 出错了

我有一个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> 

我怀疑的东西是错误与我结合。但是,也许你根本无法做到这一点。任何帮助表示赞赏。

编辑: 根据我迄今获得的信息,我的绑定是不正确的。但事实证明,我不能做我想做的事情。从本质上讲,我试图通过设置转换器使用绑定:

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

Visual Studio中告诉我:

A“绑定”不能在 类型的 “转换器”属性设置'捆绑'。 “绑定”只能在DependencyObject的DependencyProperty上设置为 。

所以,现在我想这个问题就变成了:用什么方式,我可以解决这个问题?我需要一个转换器,了解将用于其屏幕的ViewModel的状态。

回答

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的时候,我所有的耳朵!否则,我猜这个关闭了。

3

您的绑定是错误的。该转换器是绑定的属性,而不是路径内的物业

这里是从我的项目的一些示例代码:

<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(); 
    } 
}