Это простой шаблон регулярного выражения для филиппинских номеров мобильных телефонов:
((\+[0-9]{2})|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}
или
((\+63)|0)[.\- ]?9[0-9]{2}[.\- ]?[0-9]{3}[.\- ]?[0-9]{4}
будет соответствовать этим:
+63.917.123.4567
+63-917-123-4567
+63 917 123 4567
+639171234567
09171234567
Первый будет соответствовать любому двухзначному коду страны, в то время как второй будет соответствовать исключительно филиппинскому коду страны.
Проверьте его здесь: http://refiddle.com/1ox
Основная проблема заключается в том, что вы устанавливаете свой DataContext UserControl в свой конструктор:
DataContext = this;
Вы не должны этого делать, потому что он разбивает любые привязки на основе DataContext, например. к экземпляру модели представления в унаследованном значении DataContext.
Вместо этого вы изменили бы привязку в XAML UserControl следующим образом:
<TextBox Text="{Binding SelectedFile,
RelativeSource={RelativeSource AncestorType=UserControl}}" />
Теперь, когда вы используете свой UserControl и записываете привязка как
<userControls:FileBrowserControl SelectedFile="{Binding SelectedFile}" />
свойство SelectedFile привязано к свойству SelectedFile в вашей модели представления, которое должно быть в DataContext, унаследованном от родительского элемента управления.
Никогда не устанавливайте DataContext UserControl внутри usercontrol:
ЭТО НЕПРАВИЛЬНО:
this.DataContext = someDataContext;
, потому что, если кто-то будет использовать ваш пользовательский контроль, его обычной практикой является установка его datacontext и это противоречит тому, что вы установили ранее
<my:SomeUserControls DataContext="{Binding SomeDataContext}" />
Какой из них будет использоваться? Ну, это зависит ...
То же самое относится к свойству Name. вы не должны указывать имя для UserControl следующим образом:
<UserControl x:Class="WpfApplication1.SomeUserControl" Name="MyUserControl1" />
, поскольку он находится в конфликте с
<my:SomeUserControls Name="SomeOtherName" />
РЕШЕНИЕ: В вашем управлении просто используйте RelativeSource Mode = FindAncestor:
<TextBox Text="{Binding SelectedFile, RelativeSource={RelativeSource AncestorType="userControls:FileBrowserControl"}" />
На ваш вопрос о том, как все эти сторонние элементы управления выполнены: они используют TemplateBinding. Но TemplateBinding можно использовать только в ControlTemplate. http://www.codeproject.com/Tips/599954/WPF-TemplateBinding-with-ControlTemplate
В usercontrol xaml представляет Content of UserControl, а не ControlTemplate /
С помощью этого:
<userControls:FileBrowserControl SelectedFile="{Binding SelectedFile}" ...
DataContext FileBrowserControl уже настроен сам по себе, поэтому вы действительно пытаетесь связать с SelectedFile, где DataContext - это FileBrowserControl, а не родительский ViewModel.
Дайте свое имя для просмотра и используйте вместо него привязку ElementName.
SelectedFile="{Binding DataContext.SelectedFile, ElementName=element}"
God like
:) Большое спасибо, я не думал, что привязка в родительском объекте по-прежнему относится к DataContext для ребенка. Но я немного потерял. Как все эти сторонние библиотеки делают свой пользовательский контроль, не требуя этого ElementName
?
– J4N
11 March 2015 в 09:53