C# 通过xaml访问DataTemplate元素

C# 通过xaml访问DataTemplate元素,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,我想通过CommandParameter从我的主窗口xaml访问txtLang(模板中存在textblock)textblock 我该怎么做?代码如下: 主窗口: <TreeView x:Name="TreeView" ItemTemplate="{DynamicResource TreeViewDataTemplate}" ItemsSource="{Binding PLanguageCollection}"/> <Button CommandParameter="{Bind

我想通过CommandParameter从我的主窗口xaml访问
txtLang
(模板中存在textblock)textblock

我该怎么做?代码如下:

主窗口:

<TreeView x:Name="TreeView" ItemTemplate="{DynamicResource TreeViewDataTemplate}" ItemsSource="{Binding PLanguageCollection}"/>
<Button CommandParameter="{Binding ElementName=TreeView,Path="SelectedItem...//What is the path?
我理解这是因为dependencProperty在开始时是“Unset”的,因为它在运行时由dataTemplate加载。
但是我如何才能防止这种情况发生呢?

使用
{Binding SelectedItem.Language}
,或者如果您的
SelectedItem
返回的是
树项目而不是数据对象,则可能使用
{Binding SelectedItem.DataContext.Language}

在使用该模板之前,DataTemplate中的对象实际上并不存在,因此不能像引用其他对象那样引用。此外,如果模板被多次使用,您将有多个名为“txtLang”的文本块,因此您的代码将不知道引用哪个对象


我总是认为数据模板是饼干切割工具。在使用cookie cutter制作至少一个cookie之前,您不能引用cookie:)

我编辑了我的文章,其中包含了由于代码中的此更改而获得的详细信息。希望你能帮助我@idish根据您发布的代码,我怀疑问题发生在转换器中的某个地方,因为绑定通常只给出警告,而不是异常。我会在那里放一个断点,测试每个值,看看它是什么,并在那里添加适当的处理。很可能其中一个值不能转换为字符串。最后一个绑定(第四个)是创建异常的绑定。这是因为我在调试模式下看到依赖项属性未设置,这就是它无法将其转换为字符串的原因。@idish您应该能够检查它是否为
DependencyProperty.UnsetValue
,如果是,请使用空白字符串:)Rachel,我很抱歉响应太晚,我一直很忙。。我真的不明白我应该在哪里检查从属财产,以下是我发现的:
<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'.