Проблема связывания Wpf - PullRequest
       0

Проблема связывания Wpf

3 голосов
/ 21 декабря 2010

У меня в окне прямоугольник с подсказкой, Нажав на кнопку, вы можете изменить текст всплывающей подсказки, но это не так.

XAML:

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>

    <Grid.Resources>
        <ToolTip x:Key="@tooltip">
            <TextBlock Text="{Binding Name}" />
        </ToolTip>
    </Grid.Resources>

    <Rectangle Width="200" Height="200" Fill="LightBlue" VerticalAlignment="Center" HorizontalAlignment="Center"
            ToolTip="{DynamicResource @tooltip}" />
    <Button Click="Button_Click" Grid.Row="1" Margin="20">Click Me</Button>
</Grid>

код позади:

public partial class Window1 : Window
{

    public Window1()
    {
        DataContext = new Person { Name = "A" };
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        DataContext = new Person { Name = "B" };
    }
}

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

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

Пример:

<ToolTip x:Key="@tooltip">
    <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Parent.PlacementTarget.DataContext.Name}" />
</ToolTip>

Причина:

Причина, по которой это работает, а ваша - нет, заключается в том, что элемент TextBlock никогда не получает уведомления об изменении свойства с именем Name, которое вы связываете в своем коде.

Чтобы исправить это, в этом примере TextBlock привязано к свойству Parent (ToolTip)> PlacementTarget (Button)> DataContext (Person)> Name. Здесь TextBlock имеет ссылку на PlacementTarget, который в вашем случае является Button. Button уведомляет TextBlock об изменении значения свойства DataContext, при котором уведомление TextBlock обновляется.

0 голосов
/ 21 декабря 2010

Да, это работает, но не согласованно. Это работает иногда, но не всегда. Кажется, это больше для меня ошибка синхронизации. Но вы можете немного изменить свой подход, чтобы заставить его работать

Сначала вы должныреализовать механизм уведомлений в вашем классе Person

Sample

 public class Person:INotifyPropertyChanged
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; OnPropertyChanged("Name"); }
    }



    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged(string name)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }
    #endregion
}

Затем вам нужно создать свойство для своего класса person и установить его как datacontext. Теперь вы можете простоизмените значение имени при нажатии кнопки, и оно будет работать хорошо

Пример

public Window1()
    {
        MyPerson = new Person();
        MyPerson.Name = "A";
        DataContext = MyPerson;
        InitializeComponent();
    }

    private Person myPerson;

    public Person MyPerson
    {
        get { return myPerson; }
        set { myPerson = value; OnPropertyChanged("MyPerson"); }
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MyPerson.Name = "B";
    }

Проверьте, поможет ли это ...

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