Невозможно привязать заголовок окна к контексту данных MVVM - PullRequest
1 голос
/ 27 марта 2020

У меня есть Net Framework 4.7.2. Приложение, которое я пишу в WPF / C#.

Я пытаюсь связать заголовок Main Windows 'со свойством в его контексте данных, PartyName, но продолжаю получать ошибку во время выполнения .

Вот XAML для окна:

    <Window x:Class="MyDM.View.Windows.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:vm="clr-namespace:MyDM.ViewModel"
            xmlns:ctrl="clr-namespace:MyDM.View.Controls"
            Height="778" 
            Width="459"
            Title="{Binding Path=PartyName, Mode=OneWay, Converter={StaticResource MainTitle}}"
            Background="White" 
            WindowStartupLocation="CenterScreen">
        <Window.DataContext>
            <vm:MainWindowVM/>
        </Window.DataContext>
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="..\Dictionaries\ConverterDictionary.xaml"/>
                    <ResourceDictionary Source="..\Dictionaries\StyleDictionary.xaml"/>
                    <ResourceDictionary Source="..\Dictionaries\TemplateDictionary.xaml"/>
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Window.Resources>
<Grid>
...
</Window>

И это класс для DataContext:

    public class MainWindowVM : Notifier
    {
        #region Private Data
        private string thePartyName;
        private ObservableCollection<PlayerCharacter> theCharacters;
        private int theSelectedIndex;
        #endregion Private Data

        #region Public Properties
        public string PartyName
        {
            get { return thePartyName; }
            protected set
            {
                thePartyName = value;
                OnPropertyChanged("PartyName");
            }
        }

        public ObservableCollection<PlayerCharacter> Characters
        { 
            get { return theCharacters; }
            set
            {
                theCharacters = value;
                OnPropertyChanged("Characters");
            }
        }

        public int SelectedIndex
        {
            get { return theSelectedIndex; }
            set
            {
                theSelectedIndex = value;
                OnPropertyChanged("SelectedIndex");
            }
        }

        public MainWindowVM()
        {
            thePartyName = string.Empty;
            theCharacters = new ObservableCollection<PlayerCharacter>();
        }

    }
}

Всякий раз, когда я запускаю приложение, я получаю ошибку :

System. Windows .Markup.XamlParseException HResult = 0x80131501
Message = 'Предоставить значение для' System. Windows .StaticResourceExtension 'вызвало исключение.' Номер строки '8' и позиция строки '9'.
Source = PresentationFramework StackTrace: at System. Windows .Markup.WpfXamlLoader.Load (XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, логические объекты-пропуска, базовые объекты-объекты, объекты-логические объекты, )

Это исключение было первоначально сгенерировано в этом стеке вызовов: System. Windows .StaticResourceExtension.ProvideValueInternal (System.IServiceProvider, bool) System. Windows .StaticResourceExtension.ProvideValue (System.IServiceProvider) MS.Internal .Xaml.Runtime.ClrObjectRuntime.CallProvideValue (System. Windows .Markup.MarkupExtension, System.IServiceProvider)

Внутреннее исключение 1: исключение: не удается найти ресурс с именем «MainTitle». Имена ресурсов чувствительны к регистру.

Строка № 8, позиция 9 относится к строке «Заголовок» в Windows XAML. Кроме того, по какой-то причине элемент:

<vm:MainWindowVM/>

имеет ошибку «Ссылка на объект не установлена ​​на Экземпляр объекта», которая, я думаю, связана с ошибкой Bind.

Все остальные привязки работают нормально.

Может кто-нибудь из вас, умные люди, посоветовать мне, почему я не могу связать заголовок вдовы и почему я получаю ошибку "Ссылка на объект не установлена ​​..."?

Многие заранее спасибо, и держите в целости и сохранности.

1 Ответ

1 голос
/ 27 марта 2020

Всякий раз, когда я запускаю приложение, я получаю сообщение об ошибке:

Система. Windows .Markup.XamlParseException HResult = 0x80131501 Сообщение = 'Предоставить значение' Системе. Windows .StaticResourceExtension 'сгенерировал исключение.' Номер строки «8» и позиция «9». Source = PresentationFramework StackTrace: at System. Windows .Markup.WpfXamlLoader.Load (XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, логический объект skipJournaledProperties, объект rootObject, базовый объект-исключение 10, этот базовый объект - исключение. * .StaticResourceExtension.ProvideValueInternal (System.IServiceProvider, bool) System. Windows .StaticResourceExtension.ProvideValue (System.IServiceProvider) MS.Internal.Xaml. IServiceProvider) Внутреннее исключение 1. Исключение: не удается найти ресурс с именем «MainTitle». Имена ресурсов чувствительны к регистру.

Причина этого заключается в фактической привязке свойства. У вас есть конвертер для этой привязки, который не существует.

 Title="{Binding Path=PartyName, Mode=OneWay, Converter={StaticResource MainTitle}}"

У вас его нет вообще, и он не нужен, так как у вас просто есть string; это не нуждается в преобразовании. Чтобы исправить ошибку, просто удалите эту привязку конвертера.

 Title="{Binding Path=PartyName}"

Примечание: как упомянуто в комментариях @Clemens, Also remove Mode=OneWay. It's pointless; не упомянул об этом, так как это не имеет отношения к проблеме, с которой вы столкнулись.

...