我试图解决以下问题(最终成功了,但可能不是最好的方法(。这是我第一次尝试的方式:
我展示了一个带有目录和复选框的树视图,其中包含以下WPF代码:
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Grid>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<StackPanel.Resources>
<!-- This Style is applied to all TextBlock elements in the command strip area. -->
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Foreground" Value="#EE000000" />
</Style>
<local:ColorConverter x:Key="XcolorConverter" />
</StackPanel.Resources>
<TreeView ItemsSource="{Binding View}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Folder}" ItemsSource="{Binding SubFolders}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Background="{Binding Path=., Converter={StaticResource XcolorConverter}}" Text="{Binding Name}"/>
<CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</StackPanel>
</Grid>
在下面的ColorConverter方法Convert中,我需要知道的是符合特定标准的彩色目录的完整目录名。参数";值";是一个值为(MyNameSpace(的字符串。文件夹如果我检查";值";在调试器中;名称";这是显示在Treeview的文本框中的目录名(没有前面的完整路径(。但是,我无法访问程序中的值:Name(错误CS1061:"object"不包含"Name"的定义,我不明白为什么我可以在调试器中看到它但不能访问它(,也不会对我有帮助,因为我需要完整的目录路径。在ViewModel类/代码中,有一个ForEach将目录名分配给ObservableCollection文件夹。对象参数为空;我知道我可以在xaml中添加ConverterParameter=,但不知道如何从该xaml中访问实际显示的目录。
我应该如何更改WPF,使我的colorConverter。Convert方法是否可以访问它此时显示的(完整(目录?
public ICollectionView View { get => cvs.View; }
private CollectionViewSource cvs = new CollectionViewSource();
private ObservableCollection<Folder> col = new ObservableCollection<Folder>();
公用类文件夹{公共字符串名称{get;set;}public ObservableCollection子文件夹{get;set;}=new ObservableCollections((;}
public partial class ColorConverter : IValueConverter
{
private static int count;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{ // Set color based upon directory, something like if paramater.(directory=c:\temp")...
return Brushes.Green;
}
}
如果我正确理解您需要什么:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
// Validating the type of incoming value
if (value is Folder folder)
{
// Here we work with the folder variable
string name = folder.Name;
// Set color based upon directory, something like if paramater.(directory=c:\temp")...
return Brushes.Green;
}
// If the received value is not of the Folder type,
// then the converter returns an undefined value.
return DependencyProperty.UnsetValue;
}