DatagridComboBoxColumn.ItemsSource не отражает изменения из источника, кроме источника, привязанного к сетке данных - PullRequest
2 голосов
/ 03 октября 2011

Элементы ComboBox не отражают изменения, сделанные из его источника

Вот что я пытаюсь сделать: У меня есть таблица данных WPF, которая связывается с таблицей базы данных, внутри сетки данных есть столбец комбинированного списка (идентификатор группы), связанный с одним из столбцов таблицы базы данных; выпадающий список элементы взяты из другой таблицы (список идентификаторов групп). Проблема теперь в том, что когда список идентификаторов группы изменяется из другой таблицы, элементы поля со списком не вступают в силу. Кто-нибудь может помочь? Давным-давно застрял.

Вот код XAML:

<DataGridTemplateColumn Header="Group ID">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding GroupID, Mode=OneWay}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox Name="ComboBoxTeamGrpID" SelectedItem="{Binding GroupID, Mode=TwoWay}" ItemsSource="{StaticResource ResourceKey=GroupIDList}">
            </ComboBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

Вот код для GroupIDList:

public class GroupIDList : List<string>
       {
           public GroupIDList()
        {
            try
            {

                string tmp = ConfigurationManager.AppSettings["DataSvcAddress"];
                Uri svcUri = new Uri(tmp);
                JP790DBEntities context = new JP790DBEntities(svcUri);

                var deviceQry = from o in context.Devices
                                where o.GroupID == true
                                select o;
                DataServiceCollection<Device> cList = new DataServiceCollection<Device>(deviceQry);

                for (int i = 0; i < cList.Count; i++)
                {
                    this.Add(cList[i].ExtensionID.Trim());
                }

                this.Add("None");

                //this.Add("1002");
                //this.Add("1111");
                //this.Add("2233");
                //this.Add("5544");
            }
            catch (Exception ex)
            {
                string str = ex.Message;
            }
        }
    }

Вот еще одна проблема, может кто-нибудь помочь? спасибо.

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Это либо потому, что ваш GroupIdList является List, а не ObservableCollection, либо потому, что вы привязываетесь к StaticResource, который, как предполагает WPF, не изменяется, поэтому загружается только один раз.

Измените List<string> на ObservableCollection<string>, который будет автоматически уведомлять пользовательский интерфейс, когда его коллекция будет изменена, и если это все еще не сработает, то измените ItemsSource с StaticResource на RelativeSource привязку,например,

ItemsSource="{Binding 
    RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, 
    Path=DataContext.GroupIdList}"

Редактировать

Ваш родительский элемент ViewModel, в котором имеется коллекция ItemsSource вашей DataGrid, должен выглядеть примерно так, как показано ниже.Просто добавьте еще одно общедоступное свойство для GroupIdList и попросите его вернуть ваш список.Затем используйте указанную выше RelativeSource привязку для доступа к ней, предполагая, что ItemsSource вашего DataGrid привязан в виде <DataGrid ItemsSource="{Binding MyDataGridItemsSource}" ... />

public class MyViewModel
{
    private ObservableCollection<MyDataObject> _myDataGridItemsSource;
    public ObservableCollection<MyDataObject> MyDataGridItemsSource
    {
        get { return _myDataGridItemsSource; }
        set 
        {
            if (value != _myDataGridItemsSource)
            {
                _myObjects = value;
                ReportPropertyChanged("MyDataGridItemsSource");
            }
        }
    }

    private ObservableCollection<string> _groupIdList = new GroupIdList();
    public ObservableCollection<string> GroupIdList
    {

        get { return _groupIdList; }
    }
}
0 голосов
/ 03 октября 2011

WPF не будет опрашивать каждый раз и проверять, не изменился ли ваш список. Чтобы сделать это, как указала Рэйчел, вы должны сделать что-то вроде:

public class GroupIDList : ObseravableCollection<string>

РЕДАКТИРОВАТЬ:

Вот мое предложение:

Я бы на самом деле не поступил так, как ты. Что я делаю, я создаю модель представления для всей сетки, которая выглядит следующим образом: public class MyGridViewModel : DependencyObject

Что бы я использовал в качестве контекста данных для моей сетки:

DataContext = new MyGridViewModel ();

Теперь реализация MyGridViewModel будет содержать список ViewModel, представляющий мои GridRows, который представляет собой ObservableCollection

public ObservableCollection<RowGridViewModel> RowItemCollection { get; private set; }

Я сделаю это в моей dataGrid как таковой:

 <Grid>
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding RowItemCollection}" SelectionMode="Extended" SelectionUnit="Cell">
        <DataGrid.Columns>

и все, что вам нужно сделать, это заполнить RowItemColleciton правильными данными, а затем привязать столбцы к правильному свойству в RowGridViewModel ... в вашем случае это будет выглядеть (но вы должны инициализировать GroupIDList :

public class RowGridViewModel: DependencyObject
{

     public List<String> GroudIDList { get; set;
      }

    }

Позвольте мне, если это поможет

...