2011-04-18 2 views
4

목록보기 안에 포함 된 콤보 상자의 선택된 값을 바인딩해야하는이 문제가 있습니다. 콤보 상자에 항목을 표시하는 데 문제가 없습니다. 그러나 단추를 클릭 할 때 콤보 상자가 표시해야하는 항목을 지정하는 방법이 있었으면 좋겠습니다. 나는이 문제에 관한 여러 게시물이 있다고 생각하지만, 나는 내가 원하는 것을 정확히 얻을 수 없다. 여기 내 코드가있다.목록보기 (양방향)에서 WPF 콤보 상자에 바인딩

XAML :

<Grid> 
    <StackPanel Orientation="Vertical"> 
    <ListView 
     x:Name="OptionsListView" 
     ItemsSource="{Binding MyObjectCollection}"> 
     <ListView.Resources> 
      <DataTemplate x:Key="comboBoxTemplate"> 
       <ComboBox 
         Margin="0,3" 
         x:Name="MyTypeComboBox" 
         SelectedValue="{Binding Path=SelectedType, Mode=TwoWay}"> 
        <ComboBoxItem Content="ABC"/> 
        <ComboBoxItem Content="DEF"/> 
        <ComboBoxItem Content="XYZ"/> 
       </ComboBox> 
      </DataTemplate> 
     </ListView.Resources> 
     <ListView.View> 

      <GridView> 
       <GridViewColumn Header="Text-Sample" 
            Width="100"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock Text="{Binding Name}"/> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
       <GridViewColumn Header="Combo-Sample" 
            Width="100" 
            CellTemplate="{StaticResource comboBoxTemplate}" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 
    <Button Click="Button_Click">Click Me!</Button> 
    </StackPanel> 
</Grid> 

C# 코드 뒤에 :

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     OptionsListView.DataContext = this; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     //Something here that dictates what should be displayed in the combo box 
    } 

    List<MyObject> myObjectCollection = new List<MyObject>(); 
    public List<MyObject> MyObjectCollection 
    { 
     get 
     { 
      myObjectCollection.Add(new MyObject("One")); 
      myObjectCollection.Add(new MyObject("Two")); 
      return myObjectCollection; 
     } 
    } 

} 

public class MyObject : INotifyPropertyChanged 
{ 
    private string _name; 

    public MyObject(string name) 
    { 
     // TODO: Complete member initialization 
     this._name = name; 
    } 

    public string Name 
    { 
     get 
     { 
      return _name; 
     } 
    } 

    string selectedType = string.Empty; 
    public string SelectedType 
    { 
     get 
     { 
      return selectedType; 
     } 
     set 
     { 
      selectedType = value; 
      this.NotifyChange("SelectedType"); 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyChange(params object[] properties) 
    { 
     if (PropertyChanged != null) 
     { 
      foreach (string p in properties) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(p)); 
      } 
     } 
    } 
    #endregion 
} 

누군가가 나이 균열 도움이 될 수 있다면 나는 기꺼이 것입니다 ..

감사 램

답변

5

나 ' 내가 너의 질문을 오해하는지 잘 모르겠다. 귀하의 문제는 참조 문제에 관한 것 같습니다. 귀하의 코드를 조금 변경하고 버튼을 클릭하면 작동합니다.

아래 코드를 참조하십시오.

XAML :

<ComboBox Margin="0,3" 
    x:Name="MyTypeComboBox" 
    ItemsSource="{Binding RelativeSource={RelativeSource AncestorType=ListBox},Path=DataContext.Sources}" 
    SelectedValue="{Binding Path=SelectedType, Mode=TwoWay}"> 
</ComboBox> 

C# 코드 :

private Collection<string> sources = new Collection<string>() { "ABC", "DEF", "XYZ" }; 
public Collection<string> Sources { get { return sources; } } 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    myObjectCollection[0].SelectedType = Sources[0]; 
    myObjectCollection[1].SelectedType = Sources[2]; 
} 
+1

고맙습니다 Howard .. 지금은 잘 작동합니다! 분명히 나는 ​​그것에 묶이지 않은 값으로 콤보 박스를 설정하려고 노력했다. 그리고 지금, 내가 (당신이 제안한대로) 콤보 박스에 묶일 컬렉션을 지정했을 때, 그것은 매력처럼 작동하고 있습니다! 내가 맞습니까? ItemSource를 사용하여 콤보 박스에 데이터 바인딩하는 것이 여기 핵심 이었습니까? 고마워요! – Ram

+0

:) 재미 있습니다. 당신은 환영합니다 – Howard

0

당신이를 추가 할 수있는 내부 콤보 이외의 물체가있는 경우이이 작업을 수행하는 방법에 대한

foreach (ComboBox c in OptionsListView.Items) 
      { 
       c.SelectedValue = "Put your value here"; 
      } 

if (c is ComboBox) 

올바른 개체로 작업하고 있는지 확인하십시오

+0

안녕 다마스쿠스, 나는 당신의 제안이 작동 생각 dun. 내 listview는 MyObject의 컬렉션에 바인딩되어 있으므로 foreach는 OptionsListView.Items의 콤보 상자를 보지 않습니다. 그것은 정확히 내 문제가되었습니다 MyObject 유형의 항목을 볼 수 있습니다. 다행히 Howard의 제안이 도움이되었습니다! 어쨌든이 문제에 대해 빠른 생각을 해 주셔서 감사합니다. – Ram

+1

이것이 이상하지 않은 것은 나에게 이상한 것처럼 보인다. 'ListView.Item'은 목록에 표시되는 모든 비주얼 컨트롤 (즉, 콤보 박스)을 포함하는'ItemCollection'을 제공합니다. 예를 들어'ItemsSource' 속성을 사용해야하는 MyObjects로 목록을 원한다면. 어쨌든, 내가 도울 수 있으면 좋겠다. – Damascus

관련 문제