1

これが数回尋ねられたことは知っていますが、どれもうまくいきません。

この要素のリストは TreeView にあり、クリックするとパネルにパラメーターが表示されます (テックスボックス、ラベル、コンボ、その他のコンポーネントを含む)。また、コンボで選択された 1 つの要素から現在データ パネルに表示されている要素にデータをコピーできるボタンもあります ("copy data from...")。

パネル内のすべてのデータはクラスとそのプロパティにバインドされ、ツリービューはそれらのオブジェクトのコレクションにバインドされます。

問題は、コピー ボタンを押したとき (つまり、オブジェクト A から現在のオブジェクトにデータをコピーしたとき) に変更が反映されないことです。それでも、表示する要素を変更すると (TreeView で別のオブジェクトをクリック)、変更されたオブジェクトに戻ると、変更が反映されます。したがって、実際には実際のデータを変更していますが、データバインディングを更新していません。

不思議なことに、コピーボタンを2回押すと、確かに変更が反映されます。

これの原因はどれですか?どうすれば解決できますか?

これは、更新する必要があるコントロールの XAML の例です (たくさんあり、どれも機能していないため、1 つだけ投稿します)、コピー ボタン、およびツリービュー:

プロトコルのコピー: 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 に答える