我在一个活动中的数据网格中有一个组合框。基于组合框选择,我以编程方式用控件填充另一个网格。用户在这些控件中输入一些数据然后保存。绑定组合框的对象具有许多属性,其中两个属性在选定的值路径和显示成员路径中使用。使用组合框的双向绑定绑定数据。重新打开已放置在工作流上的已保存活动时,将正确重新加载数据,并在组合框中设置正确的对象值。但是在UI渲染时,只有组合框附加的值保持不变(即选定值路径和显示成员路径中的值),其余值将被重置。
知道为什么会这样吗?
P.S:将绑定设置为OneTime
可以解决检索问题,但加载后在UI上进行的任何更改都不会反映出来。
代码隐藏:
public ObservableCollection<MyRule> AllRules {get;set;}
public MyRule myRule{get;set;}
在datagrid Loaded Event中,我将AllRules填充为:
AllBusinessRules.Add(new MyRule () { RuleId = item.Id, RuleName = item.Name});
其中item.Id
和item.Name
通过服务调用从数据库中获取。
在同一事件中,如果我还将以前保存的任何规则加载为:
myRule=SelectedRule;
其中SelectedRule
也有RuleId, RuleName, Inputs and Outputs
。
代码:
<ComboBox
ItemsSource="{Binding Path=AllRules}"
SelectedItem="{Binding Path=myRule,UpdateSourceTrigger=PropertyChanged,Mode=TwoWay}"
SelectedValuePath="RuleId"
DisplayMemberPath="RuleName">
<DataTemplate>
<TextBox Text="{Binding Path=myRule.RuleName}"/>
</DataTemplate>
</ComboBox>
类别:
public class MyRule{
public int RuleId{get;set;}
public string RuleName{get;set;}
public List<string> Inputs{get;set;} //properties that are reset when the UI renders
public List<string> Outputs{get;set;} //properties that are reset when the UI renders
}
“输入和输出”属性是通过反射以编程方式生成的控件获取的,并添加到由组合框填充并保存的对象中。
我已经研究过这个问题here,但解决方案并没有解决我的问题。任何帮助都会很棒。
答案 0 :(得分:1)
SelectedValuePath
,DisplayMemberPath
设置错误。 DisplayMemberPath
应为&#34; RuleName&#34;。您已设置SelectedValue
,因此不需要SelectedValuePath
,SelectedItem
。由于SelectedItem
,Binding
会自动获取所选项目。从myRule
对象,您可以访问其他属性。
答案 1 :(得分:0)
花了很多时间来调查什么是错的,但现在我知道这很简单。
正如我已经证明,在datagrid的Loaded
事件中,我曾经设置了组合框的ItemsSource
,而在项目源中,我只设置了属性RuleId
和{{ 1}}。
<强>问题:强>
所以问题是当我在重新加载组合框时分配值,即所选值,例如, RuleName
其他属性,即输入和输出不在ItemsSource中。这就是为什么所选对象虽然正确但没有输入和输出,因为SelectedItem来自组合框的ItemsSource,给我的印象是双向绑定以某种方式重置了未与组合框绑定的属性值。
<强>解决方案:强>
最后,我将myRule=SelectedRule
对象包装在另一个对象中,如MyRule
,即
RuleInformation
public class RuleInformation{
public List<string> Inputs;
public List<string> Outputs;
public MyRule myRule{get;set;}
}
就像:
MyRule
因此组合框绑定到public class MyRule{
public int RuleId{get;set;}
public string RuleName{get;set;}
}
对象,而输入和输出属性在上层对象中保持不变。