1

我知道这已被问过几次,但没有一个答案对我有用。

我在 TreeView 中有这个元素列表,单击时会在面板中显示它们的参数(带有 texboxes、标签、组合和其他组件)。我还有一个按钮,允许将数据从组合中选择的一个元素复制到数据面板上当前显示的元素(“从...复制数据”)。

面板中的所有数据都绑定到一个类及其属性,而树视图绑定到这些对象的集合。

问题是,当我按下复制按钮(即将数据从对象 A 复制到当前对象)时,没有反映更改。然而,如果我更改要显示的元素(单击 TreeView 中的另一个对象)然后返回到更改的对象,更改就在那里。所以它实际上是在改变实际数据,而不是刷新数据绑定。

奇怪的是,如果我按两次复制按钮,确实会反映更改。

这可能是造成这种情况的原因,我将如何解决?

这是应该更新的控件的 XAML 示例(我只发布一个,因为有很多,而且它们都不起作用)、复制按钮和树视图:

Copiar datos del protocol: Copiar

<TreeView SelectedItemChanged="TvProtocolosSelectedItemChanged" Margin="10,5" Name="tvProtocolos" HorizontalAlignment="Stretch" VerticalAlignment="Top" Width="200" Height="292" MinWidth="0">
                    <TreeView.ItemContainerStyle>
                        <Style TargetType="TreeViewItem">
                            <Setter Property="IsEnabled" Value="{Binding Path=Activo}"/>
                            <Setter Property="IsExpanded" Value="False"/>
                        </Style>
                    </TreeView.ItemContainerStyle>
                    <TreeView.ItemTemplate>
                        <HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
                            <StackPanel Orientation="Horizontal">
                                <Image Source="imagenes\file_icon.gif" Margin="0,0,5,0" />
                                <TextBlock Text="{Binding Path=Name}" ></TextBlock>
                            </StackPanel>
                        </HierarchicalDataTemplate>
                    </TreeView.ItemTemplate>

                </TreeView>

这是代码隐藏文件:

public partial class NewXP2 : Window
    {
        private const int nProtocolos = 100;
        private Experiencia2 _exp2Class = new Experiencia2(nProtocolos);
        private readonly TreeView _tvProtocolos;


        public NewXP2()
        {
InitializeComponent();
_tvProtocolos.ItemsSource = _expClass.Protocolos;
xpControlsPanel.DataContext = _exp2Class.GetProtocolo(0);
            for(int i=0;i<nProtocolos;i++)
                copyFromCombo.Items.Add("Protocolo " + (i+1));
            copyFromCombo.SelectedIndex = 0;
}

        private void CopyfromButtonClick(object sender, RoutedEventArgs e)
        {
            int protIndex = copyFromCombo.SelectedIndex;

            int indiceProtocolo = 0;
            if (_tvProtocolos == null)
                return;

            var g = _tvProtocolos.SelectedItem as Composite;

            _listaData = GetData();
            _tvProtocolos.ItemsSource = _listaData;
            TreeViewItem tvi;
            if (g != null)
            {
                tvi = _tvProtocolos.ItemContainerGenerator.ContainerFromIndex(g.Indice) as TreeViewItem;

                if (tvi != null)
                {
                    tvi.IsSelected = true;
                }
                indiceProtocolo = g.Indice;
            }

            _exp2Class.SetProtocolo(indiceProtocolo, _exp2Class.Protocolos[protIndex]);

        }

这是绑定到面板的类(带有文本框)

public class ProtocoloExp2: ISerializable, IDataErrorInfo
    {
 public ProtocoloExp2(int idx)
        {
            IndiceProtocolo = idx;
            IndiceVisual = idx + 1;
        }
        public float TimeToShowTarget { get; set; }

        (...)
}
4

1 回答 1

2

检查“如何:实现 INotifyPropertyChanged 接口”。并考虑将ObservableCollection用于您的列表。INotifyPropertyChanged 接口的实现是 wpf 控件视图模型的要求,它基本上允许视图在数据更改时刷新自己。

于 2012-07-17T12:52:38.387 回答