强制绑定的UI组件刷新

时间:2012-07-17 12:42:45

标签: c# wpf

我知道这已被问了几次,但没有一个答案适合我。

我在TreeView中获得了这个元素列表,点击它时会在面板中显示它们的参数(带有texbox,标签,组合和其他组件)。我还有一个按钮,可以将数据从组合中选择的一个元素复制到数据面板上当前显示的元素("复制数据来自...")。

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

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

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

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

这是应该更新的控件的XAML示例(我只发布一个,因为有很多,但没有一个工作),复制按钮和树视图:

                                                                                                                                                                                                                                                                Copiar datos del protocolo:                                                                                                                                                                                         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; }

        (...)
}

1 个答案:

答案 0 :(得分:2)

检查"How to: Implement the INotifyPropertyChanged Interface"。并考虑将ObservableCollection用于您的列表。 INotifyPropertyChanged接口的实现是wpf控件视图模型的一项要求,它基本上允许视图在数据更改时自行刷新。