2011-03-08 91 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(); 
    } 
}