Редактировать (вставить):
Вы используете Silverlight 4, и я либо проводил тестирование в Silverlight 5, либо в WPF, из которых, вероятно, оба, но
WPF, безусловно, поддерживает RelativeSourceBinding таким образом, однако вы сделали это почти правильно.
Вывод окно в Visual Studio выдает следующую ошибку, если я прав.
Ошибка System.Windows.Data: ошибка пути BindingExpression:
Свойство «Email» не найдено в «VisualBasicSilverlightApplication1.ucDbRow»
'VisualBasicSilverlightApplication1.ucDbRow' (HashCode = 72766).
BindingExpression: Path = 'DataContext.Email'
DataItem = 'VisualBasicSilverlightApplication1.ucDbRow' (HashCode = 72766);
Целевым элементом является VisualBasicSilverlightApplication1.ucDbRow (Name = ');
Целевым свойством является 'Значение' (тип 'System.String') ..
DataContext будет проходить через usercontrol, за исключением верхнего уровня / экземпляра usercontrol.
Поэтому вместо этого:
<my:ucDbRow Title="Email" Value="{Binding Path=Email, Mode=TwoWay}" />
Единственное, что вам нужно будет изменить в своем коде, это указать на элемент, на котором вы устанавливаете DataContext, который в большинстве случаев является LayoutRoot:
(в ucUserEditor)
<my:ucDbRow Title="Email" Value="{Binding ElementName=LayoutRoot,
Path=DataContext.Email, Mode=TwoWay}" />
Предыдущий ответ
Вы переопределяете связанный текстовый текст с этим DataContext="{Binding RelativeSource={RelativeSource Self}}"
в CH_App.ucDbRow. Удалите его, и значение сработает, потому что вы вернули подложку DataContext
, однако название больше не работает.
Есть решение:
Измените ucDbRow
на это:
<UserControl x:Class="CH_App.ucDbRow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding}">
<StackPanel>
<TextBlock x:Name="txtTitle" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=Title}" Height="23"/>
<TextBox x:Name="txtValue" Text="{Binding Path=Value, Mode=TwoWay}"/>
</StackPanel>
</Grid>
</UserControl>
Примечание. Проверьте окно вывода, если привязки не работают, если произошел сбой, он находится в окне вывода.
Дополнительно:
Я бы предложил , а не использовать usercontrol в качестве элементов управления. По моему мнению, пользовательские элементы управления должны больше использоваться для представления отдельного контекста, а не половины контекста в одном и половины контекста в другом. Начните смотреть на пользовательские элементы управления больше как страницы и использовать пользовательские элементы управления и таблицы данных для подробной работы. Кроме того, создание лучшего макета становится очень простым с использованием Grid
, который (опять же, на мой взгляд) является одной из лучших функций в WPF и Silverlight, и его нельзя побить заказным пользовательским контролем.