У меня проблема с привязкой данных, шаблоном данных и моим собственным стилем WPF ListBox. Я создал стиль для ListBox с некоторыми определениями столбцов, чтобы получить лучшее представление. Смотрите скриншот:
Вот код XAML моего ListView:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Org.Vs.TailForWin.LogView"
xmlns:business="clr-namespace:Org.Vs.TailForWin.Business.Data"
>
<Style x:Key="NumberLinesStyle" TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="{Binding Index, Mode=OneWay}" />
</Style>
<DataTemplate x:Key="NumberLinesTemplate" DataType="{x:Type business:LogEntry}">
<TextBlock
Margin="5,1"
Style="{StaticResource NumberLinesStyle}"
/>
</DataTemplate>
<Style x:Key="ItemStyle" TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<ContentPresenter />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="{x:Type local:LogWindowListBox}" TargetType="{x:Type local:LogWindowListBox}">
<Setter Property="IsSynchronizedWithCurrentItem" Value="True" />
<Setter Property="ItemContainerStyle" Value="{StaticResource ItemStyle}" />
<Setter Property="SnapsToDevicePixels" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:LogWindowListBox}">
<Grid Background="{TemplateBinding Background}">
<ScrollViewer
Padding="{TemplateBinding Padding}"
CanContentScroll="True"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto"
>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="8" />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Border
x:Name="BorderBookmark"
Grid.Column="0"
Width="20"
Background="DarkGray"
/>
<Border
x:Name="BorderLineNumber"
Grid.Column="1"
MinWidth="80"
BorderThickness="0,0,1,0"
>
<Border.BorderBrush>
<VisualBrush>
<VisualBrush.Visual>
<Rectangle
Width="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualWidth}"
Height="{Binding RelativeSource={RelativeSource AncestorType={x:Type Border}}, Path=ActualHeight}"
Stroke="Black"
StrokeDashArray="2 6"
StrokeThickness="0.7"
/>
</VisualBrush.Visual>
</VisualBrush>
</Border.BorderBrush>
<ContentPresenter
x:Name="NumberLineContentControl"
Content="{Binding}"
ContentTemplate="{StaticResource NumberLinesTemplate}"
/>
</Border>
<ItemsPresenter Grid.Column="3" />
</Grid>
</ScrollViewer>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Моя проблема - ContentPresenter. В Visual Studio для отладки выводится следующая ошибка:
System.Windows.Data Error: 40 : BindingExpression path error: 'Index' property not found on 'object' ''MainWindowViewModel' (HashCode=31201899)'. BindingExpression:Path=Index; DataItem='MainWindowViewModel' (HashCode=31201899); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
Как должна выглядеть привязка ContentPresenter, чтобы получить правильное значение из моей коллекции? В главном окне моя привязка выглядит так:
<Grid>
<logView:LogWindowListBox
ItemsSource="{Binding LogEntries}"
behaviors:ListBoxSelector.Enabled="True"
/>
</Grid>
LogEntries - это ObservableCollection в MainWindowViewModel.
Вторая проблема - выбор. Я хочу, чтобы пользователь мог установить выделение в столбце BorderLineNumber. Но на данный момент это не работает. Есть идеи? Спасибо!