有没有办法刷新 WPF 中的所有绑定?

Posted

技术标签:

【中文标题】有没有办法刷新 WPF 中的所有绑定?【英文标题】:Is there a way to refresh all bindings in WPF? 【发布时间】:2011-07-06 15:17:35 【问题描述】:

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

服务端:

[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 getreturn data.val1;
    public string val2 getreturn 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
    

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

【问题讨论】:

【参考方案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 绑定到它将使您的绑定在您重新分配“数据”时更新。

【讨论】:

以上是关于有没有办法刷新 WPF 中的所有绑定?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 WPF 绑定刷新?

WPF 数据网格绑定工具提示在表格内容绑定刷新时闪烁

是否可以“刷新”WPF 数据绑定

在 WPF 中使用数据绑定时,OxyPlot 不刷新

WPF中的DataGrid怎么刷新数据

WPF数据绑定,属性值更改UI不刷新其内容[重复]