У меня есть listView элементов, которые являются экземплярами 'Book', и когда я нажимаю на книгу, комбинированный список должен отображать его ключевые слова; на самом деле это немного сложнее: в выпадающем списке содержится список всех ключевых слов всех книг (удалены дубликаты) (элементы-флажки - это флажки), а флажки выбранной книги отмечены.
вот мультибиндинг:
<ComboBox
x:Name="cbb_Keywords"
Grid.Column="2"
Width="300"
Margin="5,0,0,0"
HorizontalAlignment="Left"
ItemsSource="{Binding Source={StaticResource AllBooks}}"
DataContext="{Binding ElementName=listBoxBooks,Path=SelectedItem,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox Width="200">
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource TextInListTrueFalseConverter}" >
<Binding Path="KeywordsForTextbox"></Binding>
<Binding RelativeSource="{RelativeSource Self}" Path="Content"></Binding>
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Когда я запускаю свою программу, кажется, что все в порядке, когда я нажимаю на книгу, но я получаю исключение, когда нажимаю на поле со списком: невозможно приведение типа «MS.Internal.NamedObject» к типу «System.String». Я видел, что значение [0] равно UnsetValue.
При отладке, когда я использую шпионы для отслеживания значения WpfApp1.App.Books [0] .KeywordsForTextbox, он дает мне хорошее значение (строка, представляющая собой список ключевых слов Book [0]. проблема возникает из listboxBooks.SelectedItem.KeywordsForTextBox? Я не могу шпионить в VS значение 'listboxBooks'.
некоторый связанный контент ...
начало конструктора MainWindow:
public MainWindow()
{
InitializeComponent();
listBoxBooks.ItemsSource = App.Books;
метод конвертации конвертера:
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
var check = false;
if ((values != null && values.Length == 2))
{
string listString = (string)values[0];
string wordToFind = (string) values[1];
if ((listString != null))
{
List<string> keywordsList = listString.Split(',').ToList();
if (keywordsList.Contains(wordToFind)) check = true;
}
}
return check;
}
Метод KeywordsForTextbox:
public string KeywordsForTextbox
{
get { return string.Join(",", _keywords); }
}
и, наконец, реализация AllBooks: (как оконный ресурс)
<ObjectDataProvider
x:Key="AllBooks"
MethodName="listOfAllKeywords"
ObjectType="{x:Type mangmt:BookManagement}" />
спасибо.