组合框双向绑定重置属性

时间:2016-01-10 12:28:13

标签: c# wpf combobox binding two-way-binding

我在一个活动中的数据网格中有一个组合框。基于组合框选择,我以编程方式用控件填充另一个网格。用户在这些控件中输入一些数据然后保存。绑定组合框的对象具有许多属性,其中两个属性在选定的值路径和显示成员路径中使用。使用组合框的双向绑定绑定数据。重新打开已放置在工作流上的已保存活动时,将正确重新加载数据,并在组合框中设置正确的对象值。但是在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.Iditem.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,但解决方案并没有解决我的问题。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

SelectedValuePathDisplayMemberPath设置错误。 DisplayMemberPath应为&#34; RuleName&#34;。您已设置SelectedValue,因此不需要SelectedValuePathSelectedItem。由于SelectedItemBinding会自动获取所选项目。从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;} } 对象,而输入和输出属性在上层对象中保持不变。