sumitk.cadc Ответов: 2

Как привязать значения listview в зависимости от выбранного элемента combobox?


Привет все что я хочу привязать мой список зависит от выбранного элемента combobox вот мой код

<StackPanel Orientation="Horizontal" >
            <ComboBox Name="cmbID" Width="150"  Margin="10" Height="30" SelectedItem="{Binding CmbSelected,Mode=TwoWay}" DisplayMemberPath="ID" ItemsSource="{Binding MyStudent,Mode=TwoWay}"/>
            <Button Name="btnGetDetail"  Margin="10" Command="{Binding getDetails}" Content="Get Details" Height="30" Width="90"/>
            <TextBox Name="tbName1" Width="90" Height="30" Text="{Binding ElementName=cmbID,Path= SelectedItem.Sub}"></TextBox>
        </StackPanel>

In Above code i am binding my combobox to one observable collection and want to bind my ListView to selected item of combobox below is my code


<ListView.View >
              <GridView x:Name="grdStudentDetails">
                  <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ElementName=cmbID,Path=SelectedItem.ID}" Width="30"/>
                  <GridViewColumn Header="Name" DisplayMemberBinding="{Binding ElementName=cmbID,Path =SelectedItem.Name}" Width="100"/>
                  <GridViewColumn Header="RollNum" DisplayMemberBinding="{Binding ElementName=cmbID,Path=SelectedItem.RollNum}" Width="100"/>
                  <GridViewColumn Header="Subject" DisplayMemberBinding="{Binding ElementName=cmbID,Path=SelectedItem.Sub}" Width="100"/>
                  <GridViewColumn Header="PhNumber" DisplayMemberBinding="{Binding ElementName=cmbID,Path=SelectedItem.PhNum}" Width="100"/>
              </GridView>
          </ListView.View>
      </ListView>


I am not able to find where I am doing mistake even I bind my text box with same binding it is working fine. please refer textbox just below my combobox's XAML.


Что я уже пробовал:

I am not able to find where I am doing mistake even I bind my text box with same binding it is working fine. please refer textbox just below my combobox's XAML.

sumitk.cadc

частный студент cmbSelcted;

студенческие общественные CmbSelected
{
get { return cmbSelcted; }
set { cmbSelcted = value; OnPropertyChanged("CmbSelected"); }
}


public ObservableCollection<student> MyStudent
{
get { return myStudent; }
set { myStudent = value; OnPropertyChanged("MyStudent"); }
}

2 Ответов

Рейтинг:
2

Jason Gleim

Вы неправильно реализуете привязку данных ListView. ListView не связывает объект, который реализует интерфейс IEnumerable. Элементы в поле со списком должны быть чем-то перечислимым, например коллекциями, массивами и т. д. ListView должен быть привязан к свойству SelectedItem combobox. Так что что-то вроде:

<ListView ItemsSource="{Binding ElementName=cmbID, Path=SelectedItem}">


Когда пользователь делает выбор в выпадающем списке, свойство SelectedItem изменяется, и ListView обнаружит его через привязку. Элемент управления ListView затем установить его в DataContext к выбранный пункт Вот почему все элементы в вашем combobox должны реализовывать IEnumerable. Когда ListView устанавливает свой DataContext для выбранного элемента, он будет перебирать этот элемент, чтобы создать запись для каждой записи в выбранном элементе. Ключ здесь заключается в том, что ваши привязки для столбцов являются относительно одного элемента Таким образом, они должны быть просто {Binding ID} и {Binding RollNum} и т. д.


sumitk.cadc

в <ListView с именем="myStudent", что ItemsSource="{привязки Имяэлемента=cmbID,путь=элемент,UpdateSourceTrigger=PropertyChanged, как}" поле HorizontalAlignment="левой" ширина="420" высота="150"и GT;
<listview.view>
<!--<gridview x:name="grdStudentDetails">
<gridviewcolumn header="ID" displaymemberbinding="{Binding ElementName=cmbID,Path=SelectedItem.ID}" width="30">
&ЛТ;gridviewcolumn заголовок="наименование" displaymemberbinding="{привязки Имяэлемента=cmbID,путь =элемент.Название}" ширина="100"&ГТ;
<gridviewcolumn header="RollNum" displaymemberbinding="{Binding ElementName=cmbID,Path=SelectedItem.RollNum}" width="100">
<gridviewcolumn header="Subject" displaymemberbinding="{Binding ElementName=cmbID,Path=SelectedItem.Sub}" width="100">
<gridviewcolumn header="PhNumber" displaymemberbinding="{Binding ElementName=cmbID,Path=SelectedItem.PhNum}" width="100">
-->
<gridview x:name="grdStudentDetails">
&ЛТ;gridviewcolumn заголовок="код" displaymemberbinding="{привязки идентификатор}" ширина="30"и GT;
&ЛТ;gridviewcolumn заголовок="наименование" displaymemberbinding="{привязки имя}" ширина="100"&ГТ;
<gridviewcolumn header="RollNum" displaymemberbinding="{Binding RollNum}" width="100">
<gridviewcolumn header="Subject" displaymemberbinding="{Binding Sub}" width="100">
<gridviewcolumn header="PhNumber" displaymemberbinding="{Binding PhNum}" width="100">





я сделал это соответственно,но до сих пор нет никаких решений, я также делюсь своим классом viewmodel.cs plz, посмотрите на него

Jason Gleim

Вместо привязки списка в поле со списком, просто привязать его непосредственно к выбранной студентом:
<имя элемента управления ListView="myStudent", что ItemsSource="{привязки CmbSelected, режим=односторонний}" поле HorizontalAlignment="левой" ширина="420" высота="150"и GT;

Нет необходимости привязываться к элементу пользовательского интерфейса, когда ViewModel предоставляет нужное свойство. Именно так вы и должны связывать данные в любом случае... всегда к ViewModel.

Вы не показываете, как выглядит ваш студенческий класс, но я предполагаю, что он не реализует IEnumerable. Проверьте выходные данные отладки, и вы *можете* найти ошибку приведения типа, указывающую, что ListView не может привести student к IEnumerable.

У меня такое чувство, что вы просто используете неправильный контроль. Когда вы выбираете студента в выпадающем списке, вы просто выбираете одного студента, не так ли? Это не то, для чего нужен ListView. Если это так, то вам следует просто использовать панель стека и текстовые блоки.

sumitk.cadc

я хочу показать одну деталь студента в listview, какой идентификатор был выбран элементом combobox.
drive.google.com/open?id=0B4fArMytRDVPREF3bDZBT0tudEk
я загрузить мой код плз взглянуть на него.плз, посмотрите на правую сторону ComboBox и ниже списка.
и можно ли привязать команду к выбранному элементу listview или combobox?
я хочу, чтобы если я выберу любую строку в listview, то она должна автоматически отражаться в текстовом поле.
я сделал это с помощью команды привязки на кнопке для обновления.после нажатия она отражается в моем текстовом поле.
Спасибо

Рейтинг:
1

Member 12061698

I found the answer.  It was as simple as I first thought.  The ComboBox was to be populated with victim data when the user selected a victim.  

I figured it had to be a simple binding to the selected item, and it is.  Here is how it is done for the InvolvementNumber, which is victim property. VictimNames is the ComboBox, and the Path got me there. 

 <StackPanel Grid.Row="0" Grid.Column="0">
     <TextBlock> #</TextBlock>
     <TextBlock Name="VictimNumber"  
         Style="{StaticResource PartIIGridIsEnabledTextBlock}" 
         Text="{Binding ElementName=VictimNames,Path=SelectedItem.InvolvementNumber}"/> </StackPanel>