Основная проблема заключается в том, что вы пытаетесь создать URI, используя неправильный синтаксис.Включив схему file:///
в текст URI, вы обещаете классу System.Uri
, что вы собираетесь предоставить действительный URI, хотя на самом деле у вас его нет.
Существует много различных способовобойти это.
Самое простое - использовать %23
вместо #
там, где требуется хеш-символ (знак числа).Это правильное экранирование для символов, которые в противном случае недопустимы для URI, например, #
.
Например:
<XmlDataProvider x:Name="TeamData" Source="file:///D:/Users/username/Documents/Visual Studio 2017/Projects/C%23\Windows Presentation Foundation/ListViewBinding/ListViewBinding/bin/Debug/Teams.xml" XPath="Teams/Team" />
По иронии судьбы, один из других способов - это простоне включать в путь компонент file:///
и указывать обычный путь Windows.Хотя это и не рекомендуется, класс .NET System.Uri
поддерживает автоматическую интерпретацию путей к файлам Windows для строк, переданных без схемы.
Например:
<XmlDataProvider x:Name="TeamData" Source="D:\Users\username\Documents\Visual Studio 2017\Projects\C#\Windows Presentation Foundation\ListViewBinding\ListViewBinding\bin\Debug\Teams.xml" XPath="Teams/Team" />
Это сработало бы просто отлично.
Все это говорит о том, что мои предпочтительные альтернативы очень мало похожи на те, что указаны выше.Первым было бы внедрить XML как ресурс в программу и просто загрузить его из URI ресурса.Будет работать простая строка, или вы можете использовать схему pack:
.
Тогда вам вообще не придется иметь дело с файловой системой.
Если вы действительно хотите внешний файлдругая альтернатива - создать объект модели представления, который сделает всю работу за вас.Укажите настраиваемые свойства для пути к файлу XML и XPath для XML, а затем в модели представления при любом изменении этих свойств установите другое свойство, которое возвращает объект XmlDataProvider
, в котором свойства Source
и XPath
имеютбыл установлен на существующие свойства модели представления.Затем вы можете просто привязать свойство ListBox.ItemsSource
непосредственно к свойству XmlDataProvider
модели представления (т. Е. Как ItemsSource={Binding XmlDataProvider.Data}
, где предполагается, что имя свойства в модели представления равно XmlDataProvider
- обратите внимание, что путь привязки должен включать Data
свойство объекта XmlDataProvider
, так как это фактические привязываемые данные).
Одна из приятных особенностей этого подхода заключается в том, что он упрощает работу с относительными путями, поскольку обычно XmlDataProvider
пытаетсяобрабатывать вещи, которые выглядят как относительные пути, как если бы они были именами ресурсов.Это также дает вам больший контроль над процессом связывания, в случае, если вы хотите выполнить дополнительную настройку (например, включить дополнительные пути поиска для относительных путей и тому подобное).
Конечно, недостатком является то, что естьбольше кодаНо большинство из них - шаблонные, а остальные менее вероятно станут проблемой обслуживания, какой могут быть необработанные пути к файлам в XAML.