我想通过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加载的。 但是我怎么能阻止它发生呢?
答案 0 :(得分:2)
如果{Binding SelectedItem.Language}
返回{Binding SelectedItem.DataContext.Language}
而非您的数据对象
SelectedItem
或TreeViewItem
在使用模板之前,DataTemplate中的对象实际上并不存在,因此您无法像其他对象一样进行引用。此外,如果多次使用模板,您将有多个名为&#34; txtLang&#34;的文本块,因此您的代码无法知道要引用的对象。
我一直认为DataTemplates是cookie切割器。您不能引用cookie,直到您使用cookie切割器制作至少一个cookie:)