У меня есть ObservableCollection «DataItem», который содержит TextBlock. Идея состоит в том, чтобы связать ObservableCollection с ListView с помощью ContentControl. Я хочу иметь возможность манипулировать TextBlocks программно, и эти изменения отражать в презентации, и это кажется наиболее эффективным способом сделать это.
Я заполняю ObservableCollection несколькими объектами DataItem и добавляю текстовые данные в каждый TextBlock. Затем я пытаюсь выделить фрагмент текста в TextBlock программно.
public class DataItem: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
private readonly TextBlock tb;
public TextBlock TB
{
get { return tb; }
}
public DataItem()
{
tb = new TextBlock
{
TextWrapping = Windows.UI.Xaml.TextWrapping.Wrap,
IsTextSelectionEnabled = true,
SelectionHighlightColor = new Windows.UI.Xaml.Media.SolidColorBrush(Colors.Orange)
};
}
}
private ObservableCollection<DataItem> DataItems { get; set; } = new ObservableCollection<DataItem>();
// Затем в OnNavigatedTo () ...
for (int i = 0; i < 5; i++)
{
DataItem dataItem = new DataItem();
dataItem.TB.Text = string.Format("This is sentence Number {0}", i);
DataItems.Add(dataItem);
}
MyListView.ItemsSource = DataItems;
// А это часть XAML ...
<ListView x:Name="MyListView">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsWrapGrid MaximumRowsOrColumns="7" Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:DataItem">
<ContentControl Content="{Binding TB, Mode=OneWay}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
// Наконец, это код, который пытается выбрать:
TextPointer pos = DataItems[2].TB.ContentStart;
TextPointer beg = pos.GetPositionAtOffset(4, LogicalDirection.Forward);
TextPointer end = pos.GetPositionAtOffset(8, LogicalDirection.Backward);
try
{
DataItems[2].TB.Select(beg, end);
}
catch(Exception exc)
{
string s = exc.Message.ToString();
}
Отладчик даже не доходит до блока Catch. Операционная система показывает: System.AccessViolationException: 'Попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена. '
Возможно ли выделение сегмента текста в TextBlock этим методом? Какую другую стратегию вы бы предложили?