我需要在WPF應用程序中使用樹視圖控件 我創建嵌套數據(具有DataItem類型)並將其分配給樹視圖控件。 創建hierarchicaldatatemplate並將其分配給TreeView控件 添加一個ContextMenu到TreeView控件, 現在我要禁用或啓用的SelectedItem的一個屬性菜單項(它應該是DataItem的,我想)「的IsEnabled」如何啓用/禁用menuitem(在contextmenu中)樹視圖selecteditem
如何解決這個問題?
<HierarchicalDataTemplate x:Key="dt" ItemsSource="{Binding Items}">
<TextBlock x:Uid="TextBlock_2" Text="{Binding Name}">
</TextBlock>
</HierarchicalDataTemplate>
<TreeView x:Name="tree_3" Height="200"
ItemTemplate="{StaticResource dt}"
>
<TreeView.ContextMenu>
<ContextMenu>
<MenuItem ItemsSource="{Binding SelectedItem}"
Header="doA" IsEnabled="{Binding IsEnabled, Mode=OneWay}" />
<MenuItem Header="doB" IsEnabled="False"/>
<MenuItem Header="doC" />
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>
class DataItem : DependencyObject //INotifyPropertyChanged
{
private List<DataItem> _items = new List<DataItem>();
public List<DataItem> Items
{
get
{
return _items;
}
}
public string Name { get; set; }
public int Category { get; set; }
public bool IsEnabled { get; set; }
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
List<DataItem> allData = new List<DataItem>();
DataItem i1 = new DataItem() { Name = "Test1", Category = 1, IsEnabled = false };
DataItem i2 = new DataItem() { Name = "Test2", Category = 2, IsEnabled = false };
DataItem i3 = new DataItem() { Name = "Test3", Category = 3, IsEnabled = true };
DataItem t1 = new DataItem() { Name = "Template 1", Category = 1, IsEnabled = true };
DataItem t2 = new DataItem() { Name = "Template 2", Category = 1, IsEnabled = false };
i1.Items.Add(t1);
i1.Items.Add(t2);
allData.Add(i1);
allData.Add(i2);
allData.Add(i3);
tree_3.ItemsSource = allData;
}
我用下面的方法解決了這個問題。
上下文菜單創建一個資源
<ContextMenu x:Uid="ContextMenu_1" x:Key="TreeViewItemContextMenu" ItemsSource="{Binding}"> <MenuItem x:Uid="MenuItem_1" Header="Rename" IsEnabled="{Binding Path=., Converter={StaticResource renameMenuConverter}}" Click="RenameMenu_OnClick" /> </ContextMenu>
創建樹視圖項的風格,並使用上述
<Style TargetType="{x:Type TreeViewItem}" x:Uid="Style_1"> <Setter x:Uid="Setter_32" Property="ContextMenu" Value="{StaticResource TreeViewItemContextMenu}"> </Setter> ... </Style>
上下文菜單資源實現的轉換器。根據上面的標記擴展,傳入的轉換參數是當前選定的項目,因此我可以獲取它的屬性並進行檢查。
感謝您的全力幫助。
您還可以在Tag屬性中添加唯一標識符。你可能會問:「我可以使用DataItem的名稱來訪問它們?」但要做到這一點,您要麼將其全球聲明爲朋友,要麼將其用於設計器代碼中。否則,您無法處理該對象。您還可以爲DataItems添加一個顯式的Event Listener來完成這項工作。像往常一樣,程序員和樹上的分支一樣多! –