2012-04-27 3 views
3

내가 가지고있는 뷰 모델은 MyEnum는 사용자가 입력 MyEnum?,이다 속성 ProcessOption를 보유하고이양방향

<DataTemplate DataType="{x:Type ViewModels:ViewModel}"> 
    <Views:View /> 
</DataTemplate> 

같은 DataTemplate을 사용하여 내 뷰 모델에 연결된보기, 열거 형은 3 가지 값인 Single, MultipleAll을 말합니다. 나는이 속성에 콤보 상자를 결합하려고, 그래서 나는 다음과 같은 오전 방법은 다음과 같습니다

뷰 모델은

public List<string> Options 
    { 
     get 
     { 
      return Enum.GetNames(typeof(MyEnum)).ToList(); 
     } 
    } 

이있는 나는 ComboboxItemsSource 속성을 결합하는 것입니다 List<string>의 속성이 있습니다. 그런 다음 ProcessOption 속성 외에도 ViewModel에는 OptionName 속성 (string)이 있습니다.이 옵션은 선택한 옵션의 이름을 유지하기위한 것입니다. ViewModel은 INotifyPropertyChanged을 구현하고 두 속성은 해당 설정자에서 PropertyChanged 이벤트를 발생시킵니다. 내가 사용하고있는 바인딩은 다음과 같습니다.

<ComboBox ItemsSource="{Binding Options}" 
    SelectedItem="{Binding OptionName}" 
    SelectedValue="{Binding ProcessOption}"/> 

이 시점까지는 제대로 작동합니다. 처음에는 콤보 상자가 비어 있으며 두 속성 모두 null이고 사용자가 옵션을 선택하면이 속성이 ViewModel에 전파됩니다.

데이터베이스에서 데이터를로드 할 때 문제가 발생하고 초기 값으로 컨트롤을로드하려고합니다. 이 경우, 뷰 모델의 생성자에서 나는이 있습니다

this.ProcessOption = objectFromDB.ProcessOption // this is the value restored from DB,  let's say it is MyEnum.Multiple 
this.OptionName = Options.First(x => x.Equals(Enum.GetName(typeof(MyEnum), objectFromDB.ProcessOption))); 

문제는 그들이 나중에 Combobox 바인딩에서 널 (null)로 설정되어, 위에서 올바른 값으로이 속성을 설정하지만,이므로, 초기 값 지키지 않는다. 나는 또한 Combobox 여전히 올바른 옵션을 표시하지 않습니다, 그것은 비어 있지만, 어떤 경우에는보기로드 후 올바른 값을 가지고 속성 '설정자에서 if (value == null) { return; } 같은 것을 시도했다.

나는 또한 IsSynchronisedWithCurrentItem 설정을 시도 했음에 유의해야하며, 콤보 상자가 비어있는 대신 첫 번째 요소가 표시된다는 점을 제외하고는 아무런 차이가 없습니다.

누구나이 바인딩을 도울 수 있습니까? 어떤 도움이라도 대단히 감사 할 것입니다, 이것은 나를 미치게합니다!

+1

콤보 박스의 SelectedItem 또는 SelectedValue 속성에만 바인딩하려고 했습니까? 네 문제가 그 방향으로있을 수 있다고 생각해. –

+0

와우, 그랬어. SelectedItem 작품에만 바인딩하는 것을 시도하지 않았다는 것을 믿을 수 없다. 그리고 바인딩 된 것에서 다른 속성을 얻을 수있다. 감사!! –

답변

0
<ComboBox ItemsSource="{Binding Options}" 
    SelectedItem="{Binding OptionName}" 
    SelectedValue="{Binding ProcessOption}"/> 

귀하가 전혀 작동해야처럼 보이지 않는 바인딩 - 당신은 양방향이 설정 바인딩이 없습니다, 나는 SelectedItemSelectedValue은 중/또는 명제라고 생각합니다.

나는 당신에게/string 변환 것이다 IValueConverter으로 OptionName 제거하고 단지 ProcessOption (양방향)에 SelectedItem을 결합 얻을 것이 좋습니다.

+0

TwoWay는이 경우 기본적으로 작동합니다. 그러나 당신이 옳다면 SelectedItem/SelectedValue 작품 중 하나에 만 바인딩 할 수 있습니다. [Bram W.] (http://stackoverflow.com/users/960585/bram-w) 위의 주석에 –