Mam dziwny błąd w swojej aplikacji, kompilator czepia się jakiegoś dziwnego rzutowania którego nie rozumiem skąd wziął:
treść wyjątku z okna "Lista Błędów" z Visual Studio 2019 (nie ma kodu błędu kompilatora):
Błąd Nie można rzutować obiektu typu 'System.Collections.Generic.List'1[Mocks.WEzAP_WPF_Models_Programy_DaneProgramu_11_13218733]' na typ 'System.Collections.Generic.List'1[WEzAP_WPF.Models.Programy.DaneProgramu]'. WEzAP_WPF C:\Users\pawell\source\repos\WEzAP_Wydruk-Etykiet_v4.0\WEzAP_WPF\Views\WalidacjaProgramowUserControl.xaml 1
nie mam pojęcia skąd się wziął typ: Mocks.WEzAP_WPF_Models_Programy_DaneProgramu_11_13218733
- to musiał wygenerować gdzies VisualStudio?
StackTrace wskazuje na mój konwerter ListaProgramowToFlowDocumentConverter
, gdy go zakomentuję w definicji <Control.Resources>
(linia 17) to widok w projekcie wyświetla się poprawnie.
Powyższy błąd ma wpływ tylko na okno designera, gdy uruchomię program, program działa poprawnie, okno się wyświetla. Konwerter działa i wyświetla poprawnie tak jak ma wyświetlać nazwy programów z zakolorowanymi fragmentami tak jak ma wyświetlać.
Podgląd w oknie projektu:
Kod mojego konwertera:
(Generalnie chodzi o to aby w richTextBox wyświetlić obiekty typu DaneProgramu ale tak aby zaznaczone fragmenty nazwy danego programu były na żółtym tle)
public class ListaProgramowToFlowDocumentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
List<DaneProgramu> listaNazwProgramow = (List<DaneProgramu>)value;
FlowDocument fd = new FlowDocument();
if (listaNazwProgramow!=null)
{
foreach (var item in listaNazwProgramow)
{
Paragraph paragraph = new Paragraph();
string poczatek = item.SygnaturaSprzetu;
string sygnaturaWersjiSoftu = item.SygnaturaWersjiSoftu;
string odstep_Soft_Widok;
string odstep_Widok_Revizja;
string widok;
if (item.DlugoscSygnaturyWersjiWidoku > 0)
{
widok = item.SygnaturaWersjiWidoku;
int startIndex = item.IndexPozycjiWersjiSoftu + item.DlugoscSygnaturyWersjiSoftu;
int dlugoscSeparatora = item.IndexPozycjiWersjiWidoku - startIndex;
odstep_Soft_Widok = item.NazwaPlikuProgramu.Substring(startIndex, dlugoscSeparatora);
int startIndex2 = item.IndexPozycjiWersjiWidoku + item.DlugoscSygnaturyWersjiWidoku;
int dlugoscSeparatora2;
if (item.DlugoscSygnaturyRewizji > 0)
dlugoscSeparatora2 = item.IndexPozycjiRewizji - startIndex2;
else
dlugoscSeparatora2 = item.NazwaPlikuProgramu.Length - startIndex2;
odstep_Widok_Revizja = item.NazwaPlikuProgramu.Substring(startIndex2, dlugoscSeparatora2);
}
else
{
odstep_Soft_Widok = "";
widok = "";
int start = item.IndexPozycjiWersjiSoftu + item.DlugoscSygnaturyWersjiSoftu;
int dlugosc;
if (item.DlugoscSygnaturyRewizji > 0)
dlugosc = item.IndexPozycjiRewizji - start;
else
dlugosc = item.NazwaPlikuProgramu.Length - start;
odstep_Widok_Revizja = item.NazwaPlikuProgramu.Substring(start, dlugosc);
}
string rewizja = item.SygnaturaRewizji;
string resztaPoRewizji;
if (item.DlugoscSygnaturyRewizji > 0)
resztaPoRewizji = item.NazwaPlikuProgramu.Substring(item.IndexPozycjiRewizji + item.DlugoscSygnaturyRewizji);
else
resztaPoRewizji = "";
paragraph.Inlines.Add(new Run(poczatek));
paragraph.Inlines.Add(new Run(sygnaturaWersjiSoftu) { Background = Brushes.Yellow, FontWeight = FontWeights.Bold });
paragraph.Inlines.Add(new Run(odstep_Soft_Widok));
paragraph.Inlines.Add(new Run(widok) { Background = Brushes.Yellow, FontWeight = FontWeights.Bold });
paragraph.Inlines.Add(new Run(odstep_Widok_Revizja));
paragraph.Inlines.Add(new Run(rewizja) { Background = Brushes.Yellow, FontWeight = FontWeights.Bold });
paragraph.Inlines.Add(new Run(resztaPoRewizji));
fd.Blocks.Add(paragraph);
}
}
return fd;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
kod mojej kontrolki RichTextbox'a do ktorego mozna bindować FlowDocument
public partial class BindowalnyRichTextBox : RichTextBox
{
public BindowalnyRichTextBox()
{
InitializeComponent();
}
public static readonly DependencyProperty FlowDocumentProperty =
DependencyProperty.Register(
"BindowalnyDocument",
typeof(FlowDocument),
typeof(BindowalnyRichTextBox),
new FrameworkPropertyMetadata(
null, new PropertyChangedCallback(OnDocumentChanged)));
public new FlowDocument BindowalnyDocument
{
get { return (FlowDocument)GetValue(FlowDocumentProperty); }
set { SetValue(FlowDocumentProperty, value); }
}
public static void OnDocumentChanged(DependencyObject obj,
DependencyPropertyChangedEventArgs args)
{
RichTextBox rtb = (RichTextBox)obj;
rtb.Document = (FlowDocument)args.NewValue;
//if (args.NewValue != null)
// rtb.Document = (FlowDocument)args.NewValue;
//else
// rtb.Document = new FlowDocument();
}
}
osadzenie kontrolki 'BindowalnyRichTextBox' na widoku wygląda tak:
<local:BindowalnyRichTextBox Grid.Row="0" Grid.Column="2"
Grid.ColumnSpan="2"
Margin="3"
IsReadOnly="True"
BindowalnyDocument="{Binding ProgramyZZapisowUIDu, Converter={StaticResource ListaToFlowDoc}}">
<local:BindowalnyRichTextBox.Resources>
<Style TargetType="{x:Type Paragraph}">
<Setter Property="Margin" Value="2"/>
</Style>
</local:BindowalnyRichTextBox.Resources>
</local:BindowalnyRichTextBox>