DependencyProperty.unsetValue в мульти-привязке - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть 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}" />

спасибо.

1 Ответ

0 голосов
/ 12 ноября 2018

Первая привязка Multi должна быть к SelectedItem в ListBox книг. Я добавил в <CheckBox.IsChecked>, где это необходимо, и Content = "{Binding}" в CheckBox:

                <ComboBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <CheckBox Width="200" Content={Binding}>
                              <CheckBox.IsChecked>
                                <MultiBinding Converter="{StaticResource TextInListTrueFalseConverter}" >
                                    <Binding ElementName=listBoxBooks, Path=SelectedItem.KeywordsForTextbox"></Binding>
                                    <Binding RelativeSource="{RelativeSource Self}" Path="Content"></Binding>
                                </MultiBinding>
                              </CheckBox.IsChecked>
                            </CheckBox>
                        </StackPanel>
                    </DataTemplate>
                </ComboBox.ItemTemplate>

Вы также можете добавить некоторую проверку в IMultiValueConverter, чтобы убедиться, что переданные значения не сброшены, чтобы избежать исключения: If Not values(0) Is DependencyProperty.UnsetValue And Not values(1) Is DependencyProperty.UnsetValue Then в VB.

Что касается поведения при установке флажка, я предполагаю, что это происходит из-за метода ConvertBack метода IMultiValueConverter. Вы можете удалить код «Throw Exception» и написать метод для добавления / удаления текста отмеченного / непроверенного поля в список ключевых слов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...