0

txtLangCommandParameter を介して、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'. 

実行時に dataTemplate によってロードされているため、最初の DependencyProperty が「Unset」であるため、これが発生することを理解しています。しかし、どうすればそれを防ぐことができますか?

4

1 に答える 1

2

を使用する{Binding SelectedItem.Language}か、データオブジェクトの代わりにを返す{Binding SelectedItem.DataContext.Language}場合SelectedItemTreeViewItem

DataTemplate内のオブジェクトは、テンプレートが使用されるまで実際には存在しないため、他のオブジェクトのように参照することはできません。さらに、テンプレートが複数回使用される場合、「txtLang」という名前の複数のTextBlockが存在するため、コードは参照するオブジェクトを認識できません。

私はいつもDataTemplatesをクッキーカッターと考えています。クッキーカッターを使用して少なくとも1つのクッキーを作成するまで、クッキーを参照することはできません:)

于 2013-01-08T20:01:20.900 に答える