通过xaml访问DataTemplate元素

时间:2013-01-08 19:32:29

标签: c# wpf mvvm binding

我想通过CommandParameter从我的MainWindow xaml访问txtLang(模板中存在的文本块)TextBlock。

我该怎么做?这是代码:

主窗口:

<TreeView x:Name="TreeView" ItemTemplate="{DynamicResource TreeViewDataTemplate}" ItemsSource="{Binding PLanguageCollection}"/>
<Button CommandParameter="{Binding ElementName=TreeView,Path="SelectedItem...//What is the path?

模板:

<DataTemplate x:Key="TreeViewDataTemplate">
    <StackPanel Orientation="Horizontal">
        <Image Height="25" Width="25" VerticalAlignment="Center"
               Source="{Binding ImagePath}"/>
            <TextBlock Name="txtLang"  VerticalAlignment="Center" Text="{Binding Language}" />
    </StackPanel>
</DataTemplate>

修改

主窗口:

   <Button Content="Create Project">

              <Button.CommandParameter>
                    <MultiBinding Converter="{StaticResource MyConverter}">
                        <Binding Path="Text" ElementName="txtDesc"/>
                        <Binding Path="Text" ElementName="txtName"/>
                        <Binding Path="SelectedItem" ElementName="ListBox"/>
                        <Binding Path="SelectedItem.Language" ElementName="TreeView"/>
                    </MultiBinding>
                </Button.CommandParameter>
            </Button>

转换器:

   public class MyConverter : IMultiValueConverter
    {
        public object Convert(object[] values)
        {
            Tuple<string, string> tuple = new Tuple<string, string>(
                (string)values[0], (string)values[1]);
            return (object)tuple;
        }

        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {

           if(values[3] is string)
        {
            Service1 service1 = new Service1();
            service1.CreateProject2((string) values[0], (string) values[1], (string) values[2], (string) values[3]);
        } 
        return null;
        }

        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

抛出的异常:

Unable to cast object of type 'MS.Internal.NamedObject' to type 'System.String'. 

我理解这是因为开头的DependencyProperty是“Unset”,因为它是在运行时由dataTemplate加载的。 但是我怎么能阻止它发生呢?

1 个答案:

答案 0 :(得分:2)

如果{Binding SelectedItem.Language}返回{Binding SelectedItem.DataContext.Language}而非您的数据对象

,请使用SelectedItemTreeViewItem

在使用模板之前,DataTemplate中的对象实际上并不存在,因此您无法像其他对象一样进行引用。此外,如果多次使用模板,您将有多个名为&#34; txtLang&#34;的文本块,因此您的代码无法知道要引用的对象。

我一直认为DataTemplates是cookie切割器。您不能引用cookie,直到您使用cookie切割器制作至少一个cookie:)