有没有办法刷新 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 中的所有绑定?的主要内容,如果未能解决你的问题,请参考以下文章