0

我在活动中的数据网格中有一个组合框。基于组合框选择,我以编程方式使用控件填充另一个网格。用户在这些控件中输入一些数据,然后保存。组合框绑定的对象有很多属性,其中两个用于选择值路径和显示成员路径。使用组合框的两种方式绑定数据来绑定数据。当重新打开已放置在工作流上的已保存活动时,数据将正确重新加载,并且在组合框中设置了正确的对象值。但在 UI 呈现时,只有与组合框附加的值保持不变(即,在选定值路径和显示成员路径中的值),其余的被重置。

知道为什么会发生这种情况吗?

PS:设置绑定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
    
    }

Inputs 和 Outputs 属性通过反射从程序生成的控件中获得,并添加到由组合框填充的对象中并保存。

我在这里研究过这个问题,但解决方案并没有解决我的问题。任何帮助都会很棒。

4

2 回答 2

1

SelectedValuePath,DisplayMemberPath设置错误。DisplayMemberPath应该是“规则名称”。SelectedValue,SelectedValuePath不需要,因为您已设置SelectedItem. SelectedItem将自动获得所选项目,因为Binding. 您可以从该myRule对象访问其他属性。

于 2016-01-10T15:10:58.717 回答
0

调查出了什么问题花了很多时间,但现在我知道这很简单。

正如我所展示的,在数据​​网格的Loaded事件中,我曾经设置ItemsSource组合框的 ,而在项目源中,我只设置了属性RuleIdRuleName.

问题: 所以问题是当我分配值时,即重新加载组合框时选择的值,例如myRule=SelectedRule其他属性,即输入和输出在 ItemsSource 中不存在。这就是为什么选择的对象虽然正确但没有输入和输出,因为 SelectedItem 来自组合框的 ItemsSource,这给我的印象是双向绑定以某种方式重置了未与组合框绑定的属性的值。

解决方案: 最后我将我的MyRule对象包裹在另一个对象中,例如RuleInformationie

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;}
}

因此,组合框绑定到MyRule对象,而输入和输出属性在上部对象中保持不变。

于 2016-01-11T17:56:26.160 回答