У меня есть XAML-код следующим образом:
<UserControl x:Class="LabsterApp.TestExplorer.TestExplorer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:TestExplorer="clr-namespace:LabsterApp.TestExplorer" MinHeight="300">
<Grid>
<StackPanel MinWidth="120">
<TreeView/>
<Grid Name="TestInfo">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox Text="Name:" Grid.Row="0" Grid.Column="0"/>
<TextBox Text="{Binding ElementName=CurrentTestInfo, Path=TestName}" Grid.Row="0" Grid.Column="1"/>
</Grid>
</StackPanel>
</Grid>
</UserControl>
Я установил контекст данных всего элемента управления в качестве его viewmodel (в коде сзади):
public TestExplorer()
{
viewModel = new TreeExplorerViewModel();
DataContext = viewModel;
InitializeComponent();
}
Viewmodel имеетCurrentTestInfo
объект, который имеет свойство TestName
(все общедоступные).В какой-то момент я обновляю CurrentTestInfo
(каждый раз создавая новый объект), но текст в текстовом поле не обновляется.Я попытался использовать:
<TextBox Text="{Binding Path=CurrentTestInfo.TestName}" Grid.Row="0" Grid.Column="1"/>
вместо этого, а также попробовал вложенную привязку (теги textbox \ text \ binding).
Соответствующая часть представления модели:
public void TreeNodeSelected(object selectedNode)
{
var node = (FolderTreeNode)selectedNode;
if (!node.IsFolder)
{
HandleTest(node);
return;
}
HandleFolderNode(node);
}
Этотестовый узел, поэтому мы переходим к HandleTest
:
// puts null/"" in all the fields:
CurrentTestInfo.Clear();
// locate the node in the currentData table
DataRow currentRow = null;
foreach (DataRow dataRow in currentData.Rows)
{
if (dataRow["TestID"].ToString().Equals(string.Empty)) continue;
if (node.TestId == Guid.Parse(dataRow["TestID"].ToString()))
{
currentRow = dataRow;
break;
}
}
CurrentTestInfo.TestName = currentRow["TestName"].ToString();
CurrentTestInfo.Owner = currentRow["TestOwner"].ToString();
CurrentTestInfo.LastUpdated = DateTime.Parse(currentRow["TestDate"].ToString());
класс TestInfo:
public class TestInfo : INotifyPropertyChanged
{
private string testName;
public string TestName
{
get { return testName; }
set
{
testName = value;
OnPropertyChanged(new PropertyChangedEventArgs("TestName"));
}
}
private DateTime? lastUpdated;
public DateTime? LastUpdated
{
get { return lastUpdated; }
set
{
lastUpdated = value;
OnPropertyChanged(new PropertyChangedEventArgs("LastUpdated"));
}
}
private string owner;
public string Owner
{
get { return owner; }
set
{
owner = value;
OnPropertyChanged(new PropertyChangedEventArgs("Owner"));
}
}
public void Clear()
{
TestName = string.Empty;
Owner = string.Empty;
LastUpdated = null;
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
}
Что я делаю не так?
Спасибо.