Есть ли способ обновить все привязки в WPF? - PullRequest
16 голосов
/ 01 марта 2011

Если мой код выглядит примерно так, как показано ниже, можно ли обновить все привязки напрямую или мне нужно жестко закодировать все привязки, чтобы обновить?

Сторона службы:

[ServiceContract]
public interface IMyServiceContract {
    [OperationContract]
    MyDataContract GetData();
}
[ServiceBehavior]
public class MyService {
    [OperationBehavior]
    public MyDataContract GetData() {
        MyDataContract data = new MyDataContract();
        data.val1 = "123";
        data.val2 = "456";
        return data;
    }
}
[DataContract]
public class MyDataContract {
    [DataMember]
    public string val1;
    public string val2;
}

xaml на стороне клиента (код шаблона пространства имен пропущен):

<Window x:Class="MyWindow" DataContext="{Binding RelativeSource={RelativeSource Self}}" Title="{Binding Path=val1, Mode=OneWay}">
    <DockPanel>
        <TextBlock Text="{Binding Path=val1, Mode=OneWay}"/>
        <TextBlock Text="{Binding Path=val2, Mode=OneWay}"/>
    </DockPanel>
</Window>

Кодирование на стороне клиента:

public partial class MyWindow {
    MyServiceClient client = new MyServiceClient();
    MyDataContract data;
    public string val1 {get{return data.val1;}}
    public string val2 {get{return data.val2;}}
    DispatcherTimer updateTimer = new DispatcherTimer();

    public MyWindow() {
        timer.Interval = new TimeSpan(0, 0, 10);
        timer.Tick += new EventHandler(Tick);
        Tick(this, null);
        timer.Start();
        InitializeComponent();
    }

    void Tick(object sender, EventArgs e) {
        data = client.GetData();
        // Refresh bindings
    }
}

Пожалуйста, не обращайте внимания на любые нарушения стандартов кодирования в примерекод, поскольку он просто предназначен в качестве примера для предполагаемого использования.

Ответы [ 3 ]

28 голосов
/ 01 марта 2011

Нашел ответ, похоже, что вызов PropertyChanged с именем свойства PropertyChangedEventArgs, установленным в "", обновляет все привязки.
Изменение DataContext тоже сработало, хотя это было немного «чище».

21 голосов
/ 01 марта 2011

Вы можете null, а затем повторно установить DataContext родительского объекта.

DataContext = null;
DataContext = data;
0 голосов
/ 01 марта 2011

Как насчет сделать «данные» свойством зависимости. Привязка вашего DataContext к этому обновит ваши привязки при повторном назначении «data».

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