clr-namespace: MyProject.ViewModels
Должно быть пространство имен с именем MyProject.ViewModels
, которое имеет класс Called MainPageViewModel
, который является открытым и имеет открытый конструктор без параметров внутри та же сборка, что и ProjectDatabaseRebuilder.MainWindow
.
Нет.
Если MyProject.ViewModels
существует в ссылочной сборке, вы должны указать это в xmlns.
xmlns:vm="clr-namespace:MyProject.ViewModels;assembly=MyProject"
или что-то подобное. Честно говоря, похоже, что вы скопировали чей-то пример, не понимая, как эти специализированные пространства имен xml работают в WPF.
Что-то подсказывает мне, что окончательный ответ будет следующим: xmlns:vm="clr-namespace:ProjectDatabaseRebuilder.ViewModels"
.
Обратите внимание, что «пространство имен» и (как указано выше) «сборка» означают пространства имен и сборки, и десериализатор xaml использует эту информацию для поиска типов во время выполнения. Если они неверны, вещи не будут работать.
Это тривиально. Вы, должно быть, сделали что-то странное с вашим проектом, что может потребовать, чтобы вы начали с нуля. Или вы можете создать новый проект, следуя моему руководству ниже, а затем сравнить его по частям с вашим, чтобы увидеть, где вы ошиблись.
Сначала создайте новое приложение WPF под названием MyWpfApplication.
Добавить папку для Views и одну для ViewModels. Добавьте показанный класс кода VM и просмотрите UserControl:
В своем классе кода добавьте следующее:
namespace MyWpfApplication.ViewModels
{
class MainWindowViewModel
{
public string Text { get; set; }
public MainWindowViewModel()
{
Text = "It works.";
}
}
}
Ваше представление также просто:
<UserControl
x:Class="MyWpfApplication.Views.MainWindowView"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Grid>
<TextBlock
Text="{Binding Text}"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</UserControl>
И, в своем Окне, делайте, по сути, то, что вы пытаетесь сделать:
<Window
x:Class="MyWpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:v="clr-namespace:MyWpfApplication.Views"
xmlns:vm="clr-namespace:MyWpfApplication.ViewModels"
Title="DERP"
Content="{Binding DataContext, RelativeSource={RelativeSource Self}}">
<Window.Resources>
<DataTemplate
DataType="{x:Type vm:MainWindowViewModel}">
<v:MainWindowView />
</DataTemplate>
</Window.Resources>
<Window.DataContext>
<vm:MainWindowViewModel />
</Window.DataContext>
</Window>
И, когда вы запускаете, вы должны видеть все как положено:
Сделайте это, затем сравните рабочее решение с вашим проектом. Если вы не можете найти каких-либо различий, вам, вероятно, нужно просто отказаться от своего решения и начать все сначала. Скопируйте код, а не файлы, в новое решение.
URL-адреса имеют довольно сложное определение - сначала вы должны решить, что вы хотите захватить. Простым примером захвата всего, что начинается с http: //
и https: //
, может быть:
preg_match_all('!https?://\S+!', $string, $matches);
$all_urls = $matches[0];
Обратите внимание, что это очень простой способ захвата недействительных URL-адресов. Я бы порекомендовал изучить POSIX и регулярные выражения PHP для более сложных задач.
Если текст, из которого вы извлекаете URL-адреса, был отправлен пользователем, и вы собираетесь отображать результат в виде ссылок где угодно, вы должны быть очень, ОЧЕНЬ осторожны, чтобы избежать уязвимостей XSS , наиболее заметных URL-адресов протокола «javascript:», но также искаженных URL-адресов , которые могут обмануть ваше регулярное выражение и / или отображающий браузер для выполнения их как URL-адресов Javascript. По крайней мере, вы должны принимать только те URL, которые начинаются с «http», «https» или «ftp».
Там '
preg_match_all('/[a-z]+:\/\/\S+/', $string, $matches);
Это простой способ, который работает не во всех, а во многих случаях. Все совпадения помещаются в $ match. Обратите внимание, что это не распространяется на ссылки в элементах привязки (