これが数回尋ねられたことは知っていますが、どれもうまくいきません。
この要素のリストは 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; }
(...)
}