0

我想txtLang通过 CommandParameter 从我的 MainWindow xaml 访问(模板中存在的文本块)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 是“未设置”,因为它是在运行时由 dataTemplate 加载的。但是我怎样才能防止它发生呢?

4

1 回答 1

2

使用{Binding SelectedItem.Language}, 或者{Binding SelectedItem.DataContext.Language}如果您SelectedItem返回 aTreeViewItem而不是您的数据对象

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

我一直认为 DataTemplates 是千篇一律的。在使用 cookie 切割器制作至少一个 cookie 之前,您无法引用 cookie :)

于 2013-01-08T20:01:20.900 回答