我有執行在其get功能的產量返回屬性:爲什麼屬性getter中的yield return會中斷WPF綁定?
數據:
public class TestSummary
{
[Description("Test1")]
public TestResult Test1 {get; set;}
[Description("Test2")]
public TestResult Test2 {get; set;}
}
public enum TestResult
{
Failed,
Passed
}
視圖模型:
private TestSummary TestResults
{
get { return new TestSummary() { Test1=Failed, Test2=Passed }; }
}
public int TimePassed
{
get
{
return 2;
}
}
public IEnumerable<String> FailedTests
{
get
{
PropertyDescriptorCollection attributes = TypeDescriptor.GetProperties(TestResults);
foreach (PropertyInfo failedResult in typeof(TestSummary).GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(p => p.PropertyType == typeof(TestResult)).Where(t => (TestResult)t.GetValue(TestResults) == TestResult.Failed))
{
yield return ((DescriptionAttribute)attributes[failedResult.Name].Attributes[typeof(DescriptionAttribute)]).Description;
}
}
}
XAML:
<UserControl>
<UserControl.DataContext>
<local:ViewModel/>
</UserControl.DataContext>
<StackPanel>
<ItemsControl ItemsSource="{Binding FailedTests}"/>
<ProgressBar Value="{Binding TimePassed}"/>
</StackPanel>
</UserControl>
工程和編譯很好(該屬性是IEnumerable類型的)。你甚至可以綁定它,並且UI更新正確。但是,使用此代碼會破壞其他控件上的其他(看似隨機的)綁定,即使是其他用戶控件的內部綁定也是如此。
我的問題是,爲什麼?這是完全有效的C#,如果有的話它應該打破綁定的UI控制,而不是其他。
更新 更新後的源代碼更完整。當我使用上面的代碼時,「TimePassed」的getter從未被調用,進度條的Value始終爲0.
如果有幫助,在函數中使用相同的yield返回值,調用它並分配result.ToList( )屬性不會破壞任何東西。我仍然很好奇爲什麼發佈的代碼導致「TimePassed」綁定失敗(getter永遠不會被調用)。
另一個有趣的是,如果我使用Snoop來調查綁定,當我嘗試查看「已損壞」元素時,getter會被調用。
請發佈此行爲的最低重複性示例。 –
代碼已更新,足以讓我重現此問題。 – BradleyDotNET
包含詳細解釋「破壞其他綁定」的含義。即你做什麼,期望什麼,發生了什麼。 – Grozz