Связывание элементов внутри DataTemplate с элементами из другого DataTemplate - PullRequest
0 голосов
/ 20 июня 2010

У меня есть два шаблона данных (один для рисования [draw] и другой для входных данных [data]). Также у меня есть два ContentControls, которые используют вышеупомянутые DataTemplates.Я хочу, чтобы оба элемента DataTemplate были связаны, чтобы, когда пользователь заполняет поле в форме данных DateTemplate, он также автоматически обновлял шаблон рисования.

Как связать элементы в рисовании DataTemplate с элементамиданных DataTemplate.Бэкэнда нет вообще.Пользователь выбирает значение из комбинированного списка, и на основании значения, выбранного в комбинированном окне, я обновляю два ContentControls соответствующими рисунками и данными DataTemplates.Пользователь заполняет соответствующие поля в форме данных и рисует шаблон, рисует эти элементы на основе некоторых бизнес-правил.

-----

    <DataTemplate x:Key="data">
        <Grid Grid.Row="0" Background="#FFFFFFFF" Name="DocumentRoot"  VerticalAlignment="Top">
            <Grid.RowDefinitions>
                <RowDefinition Height="auto" />
                <RowDefinition  Height="auto"/>
                <RowDefinition  Height="auto"/>
            </Grid.RowDefinitions>
            <Grid  Margin="10" VerticalAlignment="Top">
                <Grid.RowDefinitions>
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                    <RowDefinition />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100" />
                    <ColumnDefinition Width="200" />
                </Grid.ColumnDefinitions>

                <TextBlock Text="Heading Text" Grid.Row="1"/>
                <TextBlock Text="Ticket Text" Grid.Row="2"/>
               -----  
                <TextBox x:Name="txtHeading" Text="Heading Text" Grid.Row="1" Grid.Column="1"/>
                <TextBox x:Name="txtTicketText" Text="Ticket Text"  Grid.Row="2" Grid.Column="1"/>
                -----
            </Grid>


        </Grid>
    </DataTemplate>

 <ContentControl   Content="{Binding ElementName=cboTemplates, Path=SelectedItem.Name}"
                        ContentTemplateSelector="{StaticResource formTemplateSelector}">
                </ContentControl>

Есть идеи, как связать два элемента из разных шаблонов данных?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 20 июня 2010

Рассмотрите возможность создания класса (с именем View Model) и привяжите оба шаблона к одному экземпляру этого класса (это шаблон проектирования Model-View-ViewModel). В противном случае у вас, вероятно, будут очень сложные привязки, содержащие жестко закодированное логическое дерево.

0 голосов
/ 20 июня 2010

Почему бы вам не связать один шаблон (класса со свойством Draw и свойством Data) с обоими шаблонами. Когда один шаблон изменяет свойство Data в объекте, вы можете обновить свойство Draw в объекте, что, в свою очередь, обновит шаблон Draw.


Обновлено


Пример:

Содержимое окна

<Grid>
    <StackPanel>
        <ContentControl DataContext="{Binding}">
            <ContentControl.Template>
                <ControlTemplate>
                    <Rectangle Fill="{Binding Background}"
                               Width="200"
                               Height="200" />
                </ControlTemplate>
            </ContentControl.Template>
        </ContentControl>
        <ContentControl DataContext="{Binding}">
            <ContentControl.Template>
                <ControlTemplate>
                    <TextBox Text="{Binding ColorText}" />
                </ControlTemplate>
            </ContentControl.Template>
        </ContentControl>
    </StackPanel>
</Grid>

Код позади

public partial class MultiViewWindow : Window
{
    public MultiViewWindow()
    {
        InitializeComponent();

        DataContext = new BackgroundInfo();
    }
}

public class BackgroundInfo : INotifyPropertyChanged
{
    protected String _colorText;
    public String ColorText
    {
        get
        {
            return _colorText;
        }
        set
        {
            _colorText = value;
            RaisePropertyChanged("ColorText");
            RaisePropertyChanged("Background");
        }
    }

    public Brush Background
    {
        get
        {
            try
            {
                return new SolidColorBrush((Color)ColorConverter.ConvertFromString(ColorText));
            }
            catch (Exception)
            {
                return new SolidColorBrush(Colors.Transparent);
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    void RaisePropertyChanged(String propertyName)
    {
        PropertyChangedEventHandler temp = PropertyChanged;
        if (temp != null)
        {
            temp(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
...