2017-05-08 127 views
0

我有一個具有屬性的磁帶對象符號是List並且每個Symbol對象都有一個字符串屬性表示形式。如何將ListBoxItem的屬性綁定到已綁定到ListBox的ItemsSource的屬性

現在我有一個ListBox應該在單獨的文本框中顯示符號中每個符號的表示形式。我已經有了這與下面的XAML代碼工作:

<Grid> 
    <Grid.Resources> 
     <l:TapeToTextBoxListConverter x:Key="TapeToTextBoxListConverter"/> 
    </Grid.Resources> 
    <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Hidden"> 
     <ListBox x:Name="listBox" KeyboardNavigation.TabNavigation="Continue" ItemsSource="{Binding Path=Tape.Symbols, Converter={StaticResource TapeToTextBoxListConverter}, Mode=TwoWay}"> 
      <ListBox.ItemContainerStyle> 
       <Style> 
        <Setter Property="KeyboardNavigation.IsTabStop" Value="False" /> 
       </Style> 
      </ListBox.ItemContainerStyle> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <StackPanel.OpacityMask> 
          <LinearGradientBrush EndPoint="1, 0.5" StartPoint="0, 0.5"> 
           <GradientStop Color="#00000000" Offset="0"/> 
           <GradientStop Offset="1"/> 
           <GradientStop Color="#FF727272" Offset="0.1"/> 
           <GradientStop Color="#FF727272" Offset="0.9"/> 
          </LinearGradientBrush> 
         </StackPanel.OpacityMask> 
        </StackPanel> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
      <ListBox.Resources> 
       <Style TargetType="{x:Type TextBox}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type TextBox}"> 
           <Grid> 
            <Border Width="{Binding ActualWidth, ElementName=parentElementName}" MinWidth="80" Height="80" BorderBrush="Black" BorderThickness="2" CornerRadius="5" Background="#FFBFBFBF" /> 
            <ScrollViewer Margin="0" x:Name="PART_ContentHost"/> 
           </Grid> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
        <Setter Property="FontFamily" Value="Arial Bold"/> 
        <Setter Property="FontSize" Value="60"/> 
        <Setter Property="TextWrapping" Value="Wrap"/> 
        <Setter Property="TextAlignment" Value="Center"/> 
        <Setter Property="VerticalContentAlignment" Value="Center"/>    
       </Style> 
      </ListBox.Resources> 
     </ListBox> 
    </ScrollViewer> 
</Grid> 

並有TapeToTextBoxListConverter:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     List<Symbol> symbols = (List<Symbol>)value; 
     List<TextBox> list = new List<TextBox>(); 
     list.Add(new TextBox()); 
     foreach (Symbol symbol in symbols) 
     { 
      TextBox textBox = new TextBox(); 
      textBox.Text = symbol.Representation; 
      list.Add(textBox); 
     } 
     list.Add(new TextBox()); 
     return list; 
    } 

這已經工作並在啓動時,我得到這樣的: enter image description here

現在,當用戶編輯TextBoxes我想要Tape對象(或者確切的說是它裏面的Symbols List)來更新。 我已經在模板二傳手嘗試的

<Setter Property="Text" Value="{Binding Path=Tape.Symbols}"/> 

和類似的東西不同的變化,但沒有什麼有很大的效果。如果只是我會在我的轉換器中得到convertback函數,我已經很高興了,但我甚至無法讓它工作。

回答

0

沒有轉換器返回文本框列表。這是不必要的。

擺脫轉換器,在您的視圖模型中使用ObservableCollection<Symbol>而不是List<Symbol>,並使用DataTemplate創建文本框而不是valueconverter。一旦使用DataTemplate正確創建文本框,它本身就很簡單,可以將它們綁定到DataContext對象的Representation屬性 - 這將是Symbol,因爲ListBoxItemsSource是這些對象的集合。順便說

<ListBox 
    x:Name="listBox" 
    KeyboardNavigation.TabNavigation="Continue" 
    ItemsSource="{Binding Tape.Symbols}" 
    > 
    <ListBox.ItemContainerStyle> 
     <Style> 
      <Setter Property="KeyboardNavigation.IsTabStop" Value="False" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBox 
       Text="{Binding Representation}" 
       /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 

很酷的UI。我喜歡不透明漸變效果。

-1

首先你需要綁定,你也需要它:Mode =「TwoWay」。

您在轉換器中建立列表的方式是錯誤的。 ListBox只需要綁定(不帶轉換器)。

然後,您將定義一個包含TextBox的ItemTemplate(它接收一個DataTemplate)。

在該文本框中,您設置了嘗試與setter(僅限本次實例本身)的綁定。只有這一次,您將直接綁定到表示屬性。

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBox Text="{Binding Representation, Mode=TwoWay}"/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

此外,你不需要在ListBox上的ScrollViewer,ListBox已經有一個內部的。

+1

'Mode = TwoWay'是'TextBox.Text'的默認值。他不需要告訴它使用默認值。 –

+1

此外,您不是「定義ItemTemplate(接收DataTemplate)」。沒有「ItemTemplate」類型。 ItemTemplate是要分配DataTemplate的屬性的名稱 –

相關問題