我有TreeView
ItemsSource
设置为我拥有的模型。 3级深度是一个状态可以改变的对象,而不是为每个阶段(非常冗长的业务)编写View和ViewModel,我想用代码更新它。
所以基本上我有一个事件在我的模型更新后被触发,我抓住它然后找到与这一部分数据相关联的TreeViewItem
。我现在的问题是我不知道如何更新它的绑定以反映新值!
有人可以帮忙吗?
我知道这不是最佳做法,但我真的不想浪费时间编写大量代码来更新一件事。
由于 克里斯
答案 0 :(得分:2)
您确定在相关课程上实施INotifyPropertyChanged会不会更容易吗?
答案 1 :(得分:0)
听起来您可能需要查看UpdateSource
和UpdateTarget
方法。
MSDN reference for UpdateSource
虽然我并不完全确定当你将TreeView的ItemSource
绑定到分层数据结构时它会起作用,但我会开始调查它。
答案 2 :(得分:0)
这个例子有效,但它只有两个(不是3个)深度。它显示了一个简单的2级分层树视图,其父项为A,B和C,带有编号的子项(A.1,B.1等)。单击重命名B.1按钮时,它将B.1重命名为“Sylvia”。
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
namespace UpdateVanillaBindingValue
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
private DataClass _data;
public Window1()
{
InitializeComponent();
var data = CreateData();
DataContext = _data = data;
}
private DataClass CreateData()
{
return new DataClass
{
Parents=new List<Parent>
{
new Parent{Name="A",Children=new List<Child>{new Child{Name="A.0"},new Child{Name="A.1"}}},
new Parent{Name="B",Children=new List<Child>{new Child{Name="B.0"},new Child{Name="B.1"},new Child{Name="B.2"}}},
new Parent{Name="C",Children=new List<Child>{new Child{Name="C.0"},new Child{Name="C.1"}}}
}
};
}
private void Rename_Click(object sender, RoutedEventArgs e)
{
var parentB = _data.Parents[1];
var parentBItem = TheTree.ItemContainerGenerator.ContainerFromItem(parentB) as TreeViewItem;
parentB.Children[1].Name = "Sylvia";
var parentBItemsSource = parentBItem.ItemsSource;
parentBItem.ItemsSource = null;
parentBItem.ItemsSource = parentBItemsSource;
}
}
public class DataClass
{
public List<Parent> Parents { get; set; }
}
public class Parent
{
public string Name { get; set; }
public List<Child> Children { get; set; }
}
public class Child
{
public string Name { get; set; }
}
}
<Window x:Class="UpdateVanillaBindingValue.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<Grid.Resources>
<DataTemplate x:Key="ChildTemplate">
<TextBlock Margin="50,0,0,0" Text="{Binding Name}" />
</DataTemplate>
<HierarchicalDataTemplate x:Key="ParentTemplate" ItemsSource="{Binding Children}" ItemTemplate="{StaticResource ChildTemplate}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</Grid.Resources>
<TreeView x:Name="TheTree" ItemsSource="{Binding Parents}" ItemTemplate="{StaticResource ParentTemplate}" />
<Button VerticalAlignment="Bottom" HorizontalAlignment="Center" Content="Rename B.1" Click="Rename_Click" />
</Grid>
</Window>
这是一个hack,但每次它的ItemsSource属性发生变化时它都会重新评估DataTemplate。
理想情况下,您将在此TreeViewItem绑定的模型对象类上实现INotifyPropertyChanged,并在该值更改时触发PropertyChanged事件。事实上,你应该小心不要因为它没有引起内存泄漏:Finding memory-leaks in WPF Applications。