2016-01-10 6 views
0

У меня есть поле со списком в datagrid, расположенном в действии. Основываясь на выборе combobox, я программно программирую другую сетку с элементами управления. Пользователь вводит некоторые данные в эти элементы управления, а затем сохраняет их. Объект, связанный с полем со списком, имеет множество свойств, из которых два используются в выбранном пути пути и пути отображения. Данные привязаны с использованием двусторонней привязки для поля со списком. Когда сохраненная активность, которая была помещена в рабочий процесс, снова открыта, данные перезагружаются правильно, а правильный объект - значение, установленное в поле со списком. Но при отображении пользовательского интерфейса только значения, которые связаны с полем со списком, остаются неповрежденными (то есть в выбранном пути значений и пути элемента отображения), остальные сбрасываются.Combo Box Two Way Binding сбрасывает свойства

Любая идея, почему это может произойти?

P.S: Установка привязки к OneTime решает проблему извлечения, но любые изменения, внесенные в пользовательский интерфейс после загрузки, не отражаются обратно.

Code-Behind:

public ObservableCollection<MyRule> AllRules {get;set;} 
public MyRule myRule{get;set;} 

В DataGrid Loaded Событие Я заселить 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 

    } 

Свойство входов и выходов получается из программно сгенерированного управления с помощью отражения и добавлено к объекту, населенной ComboBox и сохранено ,

Я изучил эту проблему here, но решение не решило мою проблему. Любая помощь будет большой.

ответ

0

Понадобилось много времени, чтобы выяснить, что было не так, но теперь, когда я знаю, что это просто так просто.

Как было показано, что в случае Loaded в DataGrid, я использовал, чтобы установить ItemsSource поля со списком и в источнике элемента я поставил только свойства RuleId и RuleName.

Проблема: Таким образом, проблема в том, что, когда я присвоено значение т.е. выбранное значение по перегрузке выпадающий например, myRule=SelectedRule Другие свойства, т. Е. Входов и выходов нет в ItemsSource. Поэтому выбранный объект, хотя и корректный, не имел Входов и Выходов, поскольку SelectedItem был из ItemsSource из Combo Box, создавая впечатление, что двусторонняя привязка каким-то образом сбросила значения свойств, не связанных с полем со списком.

Решение: В конце концов я завернутые мой 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, тогда как входы и выходные свойства остаются нетронутыми в верхнем объекте.

1

SelectedValuePath, DisplayMemberPath установлены неправильно. DisplayMemberPath должно быть «RuleName». SelectedValue, SelectedValuePath не нужны, поскольку вы установили SelectedItem. SelectedItem получит выбранный товар автоматически из-за Binding. С объекта myRule вы можете получить доступ к другим свойствам.

+0

Спасибо AnjumSKhan. Сообщите, если это сработало. Но даже в этом случае SelectedItem правильно выбирается именно так, что при рендеринге сохраняются только значения, связанные с полем со списком. –

+0

По-прежнему та же проблема. Дело в том, что в событии, загруженном в сетку данных, объект имеет правильные значения, но когда событие выбора комбинированного блока изменилось, вызывается сброс значений ввода и вывода. –