2011-01-15 4 views
4

(& 일 동안이 percolate를 보낸 후 내 자신의 대답은 아래 참조) WPF에서 다음 시나리오를 달성하려고합니다.wpf datagridcomboboxcolumn의 IsSynchronizedWithCurrentItem을 사용합니다.

나는보고 추가 데이터 입력을 위해 데이터 행을 표시하는 DataGrid를 보유하고 있습니다. 새로운 앱이지만 기존 데이터가 있습니다.

과거에는 특정 분야에 데이터가 임의로 입력되어있었습니다. 이제 우리는 해당 필드의 값을 특정 목록으로 제한하려고합니다. 그래서 DataGridComboBoxColumn을 사용하고 있습니다. FWIW 나는 이것을 ComboBox가 포함 된 DataGridTemplateColumn으로 시도했다.

기존 값이 목록에없는 경우 런타임에이를 표시하려고합니다. 나는 그런 일이 일어나지 않는 것 같습니다. 내가 여기서 방대한 해결책 (모든 실패)을 시도한 것은 출발점으로 가장 논리적 인 해결책이다.

드롭 다운 값 목록은 "months"라는 Windows 리소스에 정의되어 있습니다.

<DataGridComboBoxColumn x:Name="frequencyCombo" MinWidth="100" Header="Frequency" 
    ItemsSource="{Binding Source={StaticResource months}}" 
    SelectedValueBinding="{Binding Path=Frequency,UpdateSourceTrigger=PropertyChanged}"> 
    <DataGridComboBoxColumn.ElementStyle> 
    <Style TargetType="ComboBox"> 
     <Setter Property="IsSynchronizedWithCurrentItem" Value="False" /> 
    </Style> 
    </DataGridComboBoxColumn.ElementStyle> 
</DataGridComboBoxColumn> 

값이 목록에 없으면 표시가 비어있는 것입니다. 런타임에 IsSynchronizedWithCurrentItem 요소가 실제로 False임을 확인했습니다. 내가 기대하는 것을하지 않는 것입니다.

아마도 나는 잘못된 길을 걷고 있습니다. 어쩌면 나는 콤보 박스와 함께 텍스트 박스를 사용해야 할 것이다. 아마도 XAML뿐만 아니라 일부 코드를 작성해야 할 수도 있습니다. 나는 여러 가지 일을 시도하면서 많은 시간을 보냈고 해결책을 정말로 고맙게 생각할 것입니다. 이 클래스 나 컨트롤을 사용하기 위해 몇 가지 제안을했지만 설명이 없으면 어떻게 사용합니까?.

감사합니다.

답변

5

나는 마침내를 해결했다. 트릭은 comboboxcolumn을 없애고 디스플레이 용 텍스트 상자와 편집 용 콤보 상자가있는 템플릿을 사용하는 것입니다. 그러나, 나는 여전히 새로운 문제로 몇 시간을 보냈다 ... 콤보 박스에서 선택을하면 그리드에서 콤보 박스를 사용했던 다른 모든 행을 수정하게된다. 문제가 무엇이 었는지 짐작하십시오! 이전에 사용하려고했던 IsSynchronizedWithCurrentItem 속성:)

<DataGridTemplateColumn x:Name="frequencyCombo" Header="Frequency"> 
    <DataGridTemplateColumn.CellTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding Path=Frequency}" /> 
    </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate> 
    <ComboBox 
     ItemsSource="{Binding Source={StaticResource frequencyViewSource}, 
     TargetNullValue=''}" 
     SelectedItem="{Binding Path=Frequency}" IsSynchronizedWithCurrentItem="False" 
     /> 
    </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

No lugly hacks. 드롭 다운의 맨 아래에 사용할 수없는 선택 항목이 없습니다. 이러한 추가 값을 추가 한 다음 정리할 코드가 없습니다.

Mark의 제안에 대한 답변을 제 고객의 손에 넣기 때문에 "답변"을 없애지는 않겠지 만 이것이 내가 찾고있는 해결책입니다. 나는 그것이 웹 검색의 시간 후에 "connect"항목에 묻힌 것을 발견했다.

감사합니다 everyones 도움!

+0

frequencyViewSource의 코드는 어떻게 생겼습니까? 나는 비슷한 것을하려고 노력하고있다. 콤보 상자에 표시하려는 객체 목록 내 목록이 있습니다. 하지만 ItemsSource = "{바인딩 소스 = {StaticResource frequencyViewSource}, TargetNullValue = ''} '부분이 나를 위해 일할 수 없습니다. – user1977591

0

여기에 무슨 일이 일어 났는지 알려주시겠습니까? 런타임에 "기존 값"이 무엇인지는 확실하지 않습니다. 데이터가 임의로 입력되는 필드 인 경우이를 제한하여 유효성 검사 논리를 실행하고 있음을 나타내지 만 여전히 표시하려고합니다.

또한 저는 Silverlight 측에서 더 많은 것을 알고 있습니다 ... WPF는 또한 단방향 바인딩을 기본으로합니까?

+0

미안하지만 이메일을받지 못했습니다. : 리스트에는 "1 개월" "2 개월" "3 개월"등이 있습니다. 기존 데이터에는 "3 개월"이있을 수 있습니다.이 경우에도 여전히 "3 개월"만 표시됩니다. ... ID가없고, 해시 테이블이 없습니다. 우리는 단지 드롭 다운을 제공함으로써 데이터 입력을 더 쉽게하고 그 드롭 다운리스트는 제한된 옵션 목록을 갖게 될 것입니다. 그러면 검증 로직이 필요 없습니다 등등. 이해가 되니? 그래서 나는 단지 아이템 목록에있는 값을 표시하기를 원하기 때문에 콤보 상자를 싸우고있다. –

0

정적 리소스와 뷰 모델 속성을 목록에있는 항목의 소스로 혼합하는 대신 뷰 모델에서 ObservableCollection 또는 CollectionViewSource를 사용해 보았습니까? 그런 다음 비표준 항목을 원하는대로 삽입 및 제거하고 원하는 경우 언제든지 선택 또는 제거 할 수 있습니다. 따라서 "정상적인"목록에는 정상적인 달이 있지만 이상한 것이 있으면 목록에 추가하고 선택하십시오. 뷰 모델에서만 독점적으로 제어하는 ​​것이 더 쉬워 진 것 같습니다.

+0

비표준 아이템을 콤보 박스의 아이템 목록에 삽입하고 싶지는 않지만 아마도 나는 이해할 수 없다. WPF 컴포지션 디자인을 사용하면 필자가 텍스트 상자에 들어갈 수 있기를 희망했지만, 필자는 또한 현재 동기화 된 항목과 동기화되지 않은 것을 오해하고 있습니다. ? 나는 데이터 소스로서 윈도우에서 DIFFERENT 요소를 사용할 때 이것을 사용했다는 것을 알고있다. 감사합니다 –

+0

나는 절망에서이 길을가는 것을 끝내었다. 그것은 극도로 해킹 된 느낌이지만, 나는 우아한 솔루션을 내놓으려는 고객에게 청구 할 수없는 하루를 낭비했습니다. 필요에 따라 ObservableCollection에 추가 값을 추가하고 다음에 그리드를 채울 때이를 제거합니다. 나쁜 값이 드롭 다운 목록에 표시되고 선택할 수있는 것이 좋지 않습니다. 못 생겼어. 사용자가 목록을 삭제할 때 보이지 않게하려면 * more * 코드를 추가해야합니다. 내가 사용할 수있는 것에 대한 아이디어를 주셔서 감사합니다. –

+0

FWIW, Eventsetter를 사용하여 드롭 다운 이벤트에서 레거시 항목의 가시성을 수정하는 방법을 찾으려고했습니다. DropDown은 라우팅 된 것이 아니기 때문에 이동하지 않습니다. 다른 길로 가야합니다. 나는 레거시 값을 목록에 채우는 것을 정말로 좋아하지 않습니다. 그것은 영리한 생각이었습니다. 다시 한번 감사 –

0

단지 같은 것을하지 이유 :

//create collection 
PagedCollectionView view = new PagedCollectionView(e.Result); 
view.SortDescriptions.Add(
new SortDescription("Months", ListSortDirection.Ascending)); 
gridProducts.ItemsSource = view; 

//filter collection by category 
PagedCollectionView view = new PagedCollectionView(e.Result); 
view.Filter = delegate(object filterObject) 
{ 
    Product product = (Product)filterObject; 
    return (product.CategoryName == "Legacy"); 
}; 
gridProducts.ItemsSource = view; 

//create categories through grouping 
PagedCollectionView view = new PagedCollectionView(e.Result); 
view.GroupDescriptions.Add(new PropertyGroupDescription("Legacy")); 
view.GroupDescriptions.Add(new PropertyGroupDescription("etc...")); 
gridProducts.ItemsSource = view; 
0

을이 시도 :

<DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding Months}" 
            Text="{Binding Value}" 
            IsEditable="True" /> 

        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
+0

(frequencyViewSource로 변경 개월) -> <콤보 상자 ItemsSource = "{바인딩 소스 = {정적 리소스 frequencyViewSource}}" 텍스트 = "{바인딩 경로 = 주파수}" IsEditable = "진정한"/> 이렇게하면 모든 행에 첫 번째 행의 동일한 값을 가진 콤보 박스가 표시됩니다. 하나를 편집하면 모두 새로운 값으로 변경됩니다. 유사 콘텐츠를 사용해 보겠습니다. –

관련 문제