Поле со списком DataGridTemplateColumn с Enum обновляет все строки с одинаковым значением - PullRequest
0 голосов
/ 06 мая 2020

Я устанавливаю ObjectDataProvider для Enum, как показано ниже

<Window.Resources>
    <ObjectDataProvider x:Key="EnumProvider" MethodName="GetValues" ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:Mode"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources >
public enum Mode
    {
        ModeSlow = 0,
        ModeFast = 1,
        ModeNeutral = 2,
        ModeNone = 3
    }

Вот DataGrid, который отображает значения Enum как ComboBox es

<DataGrid x:Name="dataGridView" Grid.Row="0" DataGridCell.Selected="DataGridGotFocus" 
    ItemsSource="{Binding VariedObjectList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    AutoGenerateColumns="False" CanUserDeleteRows="true" SelectionMode="Single" CanUserAddRows="True" VerticalScrollBarVisibility="Auto" ScrollViewer.CanContentScroll="True">

    <DataGrid.Columns>
        <DataGridTemplateColumn  Header=" ModeType " >
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding Source={StaticResource EnumProvider}}" 
                        SelectedItem="{Binding Path= ModeType, UpdateSourceTrigger=LostFocus, Mode=TwoWay}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <!-- Other columns ---->
    </DataGrid.Columns>
</DataGrid>

При ModeType, равном Enum, при вводе новой строки по умолчанию я хочу, чтобы она отображала «ModeSlow», но она пуста. Кроме того, если я обновляю одну строку, все предыдущие строки также обновляются с последним значением. Иногда, если я обновляюсь до ModeFast, он автоматически меняется на ModeSlow. Его поведение непредсказуемо. Что мне здесь не хватает ?. Пожалуйста, гид.

public class VariedObject : INotifyPropertyChanged
{
    private Mode modeType = Mode.ModeSlow;
    public Mode ModeType
    {
      get { return modeType ; }
      set
      {
         modeType = value;
         OnPropertyChanged("ModeType");
      }
     }
    private int val;
    public int Value {
            get { return val; }
            set
            {
                val = value;

                OnPropertyChanged("Value");
                SetValueRangeList();
            }
        }
    public List<strings> ValueRange { get; set; } 
    public string SelectedValueRange {get; set;}
}

в моем xaml.cs. (Извините, я допустил опечатку, на самом деле я привязываюсь к VariedObjectList, который является списком VariedObject)

private List<VariedObject> variedObjectList = List<VariedObject>();

public List<VariedObject> VariedObjectList {
            get { return variedObjectList ; }
            set
            {
                variedObjectList = value;

                OnPropertyChanged("VariedObjectList ");
            }
        }

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Я считаю, что когда вы привязываете Selector (ComboBox) к ObjectDataProvider, свойство IsSynchronizedWithCurrentItem селектора автоматически принимает значение true по умолчанию - это означает, что все селекторы, использующие этот ObjectDataProvider, будут синхронизировать значение SelectedItem. Попробуйте это:

<ComboBox ItemsSource="{Binding Source={StaticResource EnumProvider}}" 
IsSynchronizedWithCurrentItem=false .......
0 голосов
/ 06 мая 2020

Ваш DataGrid привязан к объекту VariedObjectList, который сам не является списком (несмотря на название). Столбцы будут искать привязку свойств в своем DataContext, установленном DataGrid. Каждый элемент в коллекции DataGrid.ItemsSource будет DataContext строки.

Поскольку VariedObjectList не является списком, все строки будут иметь одинаковый DataContext и, соответственно, один и тот же связанный объект, VariedObjectList.ModeType.

Чтобы прояснить, решение состоит в том, чтобы предоставить фактическую коллекцию DataGrid.

Надеюсь, я был вам полезен.

...