【问题标题】:Combo Box Two Way Binding resets Properties组合框双向绑定重置属性
【发布时间】:2016-01-10 12:28:13
【问题描述】:

我在活动中的数据网格中有一个组合框。基于组合框选择,我以编程方式使用控件填充另一个网格。用户在这些控件中输入一些数据,然后保存。组合框绑定的对象有很多属性,其中两个用于选择值路径和显示成员路径。使用组合框的两种方式绑定数据来绑定数据。当重新打开已放置在工作流上的已保存活动时,数据将正确重新加载,并且在组合框中设置了正确的对象值。但是在 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
    
    }

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢 AnjumSKhan。会让你知道这是否有效。但即便如此 SelectedItem 被正确选择,它只是在渲染时仅保留绑定到组合框的值。
    • 还是同样的问题。问题是在数据网格加载事件中,对象具有正确的值,但是当组合框选择更改事件被调用时,输入和输出的值被重置。
    【解决方案2】:

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

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

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

    解决方案: 最后,我将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;}
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多