如何将ListBoxItem的属性绑定到已绑定到ListBox的ItemsSource的属性
我有一个具有属性的磁带对象符号是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;
}
现在,当用户编辑TextBoxes我想要Tape对象(或者确切的说是它里面的Symbols List)来更新。 我已经在模板二传手尝试的
<Setter Property="Text" Value="{Binding Path=Tape.Symbols}"/>
和类似的东西不同的变化,但没有什么有很大的效果。如果只是我会在我的转换器中得到convertback函数,我已经很高兴了,但我甚至无法让它工作。
没有转换器返回文本框列表。这是不必要的。
摆脱转换器,在您的视图模型中使用ObservableCollection<Symbol>
而不是List<Symbol>
,并使用DataTemplate
创建文本框而不是valueconverter。一旦使用DataTemplate正确创建文本框,它本身就很简单,可以将它们绑定到DataContext
对象的Representation
属性 - 这将是Symbol
,因为ListBox
的ItemsSource
是这些对象的集合。顺便说
<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。我喜欢不透明渐变效果。
首先你需要绑定,你也需要它:Mode =“TwoWay”。
您在转换器中建立列表的方式是错误的。 ListBox只需要绑定(不带转换器)。
然后,您将定义一个包含TextBox的ItemTemplate(它接收一个DataTemplate)。
在该文本框中,您设置了尝试与setter(仅限本次实例本身)的绑定。只有这一次,您将直接绑定到表示属性。
<ListBox.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Representation, Mode=TwoWay}"/>
</DataTemplate>
</ListBox.ItemTemplate>
此外,你不需要在ListBox上的ScrollViewer,ListBox已经有一个内部的。
'Mode = TwoWay'是'TextBox.Text'的默认值。他不需要告诉它使用默认值。 –
此外,您不是“定义ItemTemplate(接收DataTemplate)”。没有“ItemTemplate”类型。 ItemTemplate是要分配DataTemplate的属性的名称 –