将DataTemplate内的项绑定到另一个DataTemplate中的项

时间:2010-06-19 20:00:32

标签: wpf xaml binding datatemplate

我有两个数据模板(一个用于绘制[draw],另一个用于输入数据[数据])另外我有两个ContentControls使用上面的DataTemplates。 我想要将两个DataTemplate的元素绑定,以便当用户在数据表单DateTemplate中填写一个字段时,它也会自动更新绘图模板。

如何将绘图DataTemplate中的元素与数据DataTemplate的元素绑定。 根本没有后端数据。用户从组合框中选取一个值,并根据组合框中选择的值,使用相关的绘图和数据DataTemplates更新两个ContentControl。用户填写数据表单中的相关字段,绘制模板根据某些业务规则绘制这些元素。

                                                                                                                                                                                                -----
                                               

    <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>

任何想法如何从不同的DataTemplates中绑定这两个元素?

提前致谢

2 个答案:

答案 0 :(得分:0)

为什么不将一个对象(具有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));
        }
    }
}

答案 1 :(得分:0)

考虑创建类(名为View Model)并将两个模板绑定到该类的单个实例(这是Model-View-ViewModel设计模式)。否则你可能会有非常复杂的绑定包含硬编码的逻辑树。