【问题标题】:Is there a way to refresh all bindings in WPF?有没有办法刷新 WPF 中的所有绑定?
【发布时间】:2023-03-30 12:47:01
【问题描述】:

如果我的代码看起来有点像下面的代码,是否可以直接刷新所有绑定,或者我是否必须对所有绑定进行硬编码才能刷新?

服务端:

[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
    }
}

请忽略示例代码中任何违反编码标准的行为,因为它只是作为预期用途的示例。

【问题讨论】:

    标签: c# .net wpf xaml binding


    【解决方案1】:

    找到了答案,似乎调用 PropertyChanged 并将 PropertyChangedEventArgs 属性名称设置为 "" 会刷新所有绑定。
    DataContext 更改也起作用了,尽管这感觉有点“干净”。

    【讨论】:

    • PropertyChanged 到底是什么...主页,控件?
    • @ΩmegaMan 这是我最后一次使用 WPF,但如果我没记错的话.. 窗口/主页。
    • 我在页面上有一个自定义控件,它或主页上都没有直接的PropertyChanged 方法。我最终做了DataContext=null
    【解决方案2】:

    你可以null然后重新设置父对象的DataContext。

    DataContext = null;
    DataContext = data;
    

    【讨论】:

    • 我似乎记得它不起作用,不。我认为它意识到您已将其设置为相同的引用,因此不会重新绑定。
    • 我认为这就是为什么 BenCr 建议首先将“null then re-set”表示为 null 作为动词,将 DataContext 设置为 null 然后设置回原始 DataContext 以便将其视为改变。
    • 这确实是我的建议。
    • 我有一个场景,将 DataContext 设置为 null 不会重置 UI - 它会保留过时的值。只有在我将 DataContext 设置为新值之后,UI 元素才会更新。例如,我有一个 Master/Detail 模式,我删除了 Master 列表中的最后一项。之后,“详细信息”字段将填充最后一个已删除项目的项目信息。当我删除除最后一项之外的所有项目时它工作正常,因为我将 DataContext 重新分配给主列表中的剩余项目之一。关于在我删除最后一项时如何让 UI “清除”这些值的任何想法?
    • 我需要撤回我之前的cmets。 UI 更新失败是由于在所述场景下的另一行代码引发了异常。删除最终 Master 项时将 DataContext 设置为 null 实际上会导致“详细信息”窗格“清除”UI 中的所有值。
    【解决方案3】:

    如何让“数据”成为依赖属性。将您的 DataContext 绑定到它将使您的绑定在您重新分配“数据”时更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 2021-07-25
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多