WPF привязка текста вложенного текстового поля не работает - PullRequest
0 голосов
/ 28 июля 2011

У меня есть 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);
        }
    }

Что я делаю не так?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 28 июля 2011

В вашей привязке ElementName используется, когда вы хотите связать со свойством элемента XAML.Например, если вы привязывали другое свойство TextBox к тексту.

Измените привязку обратно на:

Text="{Binding Path=CurrentTestInfo.TestName}"

Также убедитесь, что ViewModel реализует INotifyPropertyChanged.Ваша ViewModel должна вызывать событие PropertyChanged, чтобы элементы управления пользовательского интерфейса знали, как обновляться.

1 голос
/ 28 июля 2011

Ваша модель представления и TestInfo тип реализуют INotifyPropertyChanged ?Вы вызываете событие PropertyChanged, когда установлены свойства CurrentTestInfo и TestName?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...