2017-05-08 1 views
0

Ich habe ein Band-Objekt, das eine Eigenschaft Symbole hat, das eine Liste ist und jedes Symbol Objekt verfügt über eine String-Eigenschaft Darstellung.Wie Eigenschaft eines ListBoxItem auf eine Eigenschaft binden bereits an Itemssource des ListBox gebunden

Jetzt habe ich eine List-Box, die die Darstellungen von jedem Symbol in Symbolen in separaten Textfeldern angezeigt werden soll. Ich habe dies bereits mit folgendem XAML-Code zu arbeiten:

<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> 

Und einen 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; 
    } 

Dieses bereits arbeitet und beim Start bekomme ich diese: enter image description here

Nun, wenn die Benutzer Änderungen die TextBoxen Ich möchte, dass das Tape-Objekt (oder genauer gesagt, die Symbolliste darin) aktualisiert wird. ich bereits verschiedene Variationen von

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

und ähnliche Sachen in der Template-Setzer ausprobiert, aber nichts hat viel Einfluss. Wenn ich nur die Convertback-Funktion in meinem Konverter auslösen würde, wäre ich schon glücklich, aber ich kann nicht einmal das zum Laufen bringen.

Antwort

0

Haben einen Konverter keine Liste der Textfelder zurück. Das ist unnötig.

Sie sich von dem Konverter zu befreien, verwenden Sie einen ObservableCollection<Symbol> statt List<Symbol> in Ihrem Viewmodel, und verwenden Sie einen DataTemplate die Textfelder anstelle eines Valueconverter zu erstellen. Sobald Sie die Textfelder ordnungsgemäß mit einem DataTemplate erstellt haben, ist es einfach, sie an die -Eigenschaft des DataContext Objekts zu binden - was Symbol sein wird, da die für die ListBox eine Sammlung von diesen ist.

<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> 

Cool von der Art und Weise der Suche UI. Ich mag den Opazitätsgradienteneffekt.

-1

Zunächst einmal müssen Sie die Bindung, Sie müssen es auch sein: Mode = „TwoWay“.

Die Art und Weise Sie die Liste in den Konverter zu bauen, ist falsch. Die ListBox benötigt nur diese Bindung (ohne den Konverter).

Dann definieren Sie eine ItemTemplate (die eine Datatemplate recieves), die einen Text enthält.

Auf dieser TextBox legen Sie die Bindung von Ihrem Versuch mit dem Setter (nur dieses Mal auf der Instanz selbst). Nur dieses Mal binden Sie direkt an die Repräsentationseigenschaft.

Auch Sie brauchen diesen ScrollViewer nicht über die ListBox, die ListBox hat bereits eine innere.

+1

'Mode = TwoWay' ist der Standard für' TextBox.Text'. Er muss es nicht sagen, um den Standard zu verwenden. –

+1

Außerdem definieren Sie kein ItemTemplate (das eine DataTemplate erhält). Es gibt keinen "ItemTemplate" -Typ. ItemTemplate ist der Name der Eigenschaft, der Sie das DataTemplate zuweisen –

Verwandte Themen