Silverlight: Как связать с DataContext родительского представления? - PullRequest
1 голос
/ 17 февраля 2011

У меня есть ParentView, который содержит childView

<UserControl ... x:Name="MyParentView">
     <Grid>
        <sdk:TabControl Name="ContactTabControl">
            <sdk:TabItem Header="Contact" Name="CustomerTabItem">
                <Grid>
                    <Views:CustomerView/>
                </Grid>
            </sdk:TabItem>
        </sdk:TabControl>
    </Grid>
</UserControl>

В моем CustomerView я хотел бы привязать текстовое поле Firstname к DataContext Parent.Я пробовал это в CustomerView:

<TextBox Text={Binding ElementName=MyParentView, Path=DataContext.Firstname} />

У меня такое ощущение, что CustomerView вообще не сможет увидеть своего родителя, поэтому ElementName "MyParentView" никогда не будет найдено.

Что вы посоветуете по этому поводу?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Я сделал похожую вещь, но я просто связал ее непосредственно с Path, учитывая, что если я не укажу ей явный контекст данных, он найдет иерархию и найдет тот, который соответствует.

Итак, это должно дать вам то, что вы хотите:

<TextBox Text={Binding Path=FirstName} />

если вам нужно указать явный текстовый текст, вы всегда можете сделать:

<Grid>
    <Views:CustomerView DataContext={"CustomContextHere"}/>
</Grid>
2 голосов
/ 17 февраля 2011

Альтернативное решение Maverik's:

1 Определите свойство зависимости в вашем представлении клиента:

public partial class CustomerView : UserControl
    {
        public CustomerView()
        {
            InitializeComponent();
        }

        public static DependencyProperty FirstNameProperty =
            DependencyProperty.Register("FirstName", typeof(string), typeof(CustomerView), new PropertyMetadata(string.Empty, CustomerView.FirstNameChanged));

        public string FirstName
        {
            get { return (string)GetValue(FirstNameProperty); }
            set { SetValue(FirstNameProperty, value); }
        }

        private static void FirstNameChanged(object sender, DependencyPropertyChangedEventArgs e)
        { }
    }

2 Измените текстовое поле представления клиента для привязки к этому свойству зависимости (обратите внимание напривязка элемента "this")

<UserControl x:Class="SLApp.CustomerView"
    x:Name="this"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300">
    <Grid x:Name="LayoutRoot" Background="White">
        <TextBox Text="{Binding Path=FirstName, ElementName=this, Mode=TwoWay}"/>
    </Grid> </UserControl>

3 Измените родительское представление и привяжите его DataContext к новому свойству зависимости

<sdk:TabControl Name="ContactTabControl">
                        <sdk:TabItem Header="Contact" Name="CustomerTabItem">
                            <Grid>
                                <local:CustomerView FirstName="{Binding ElementName=ContactTabControl, Path=DataContext}"/>
                            </Grid>
                        </sdk:TabItem>
                    </sdk:TabControl>

4 Установите родительский DataContext

public partial class MyParentView : UserControl
    {
        public MyParentView()
        {
            InitializeComponent();

            ContactTabControl.DataContext = "A name";
        }
    }

Вуаля 'это работает.Не самое элегантное решение, но оно выполняет работу по вашему сценарию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...