Как двустороннее связывание словаря <enum, bool> со столбцом ListView в WPF? - PullRequest
5 голосов
/ 01 марта 2011

У меня есть такой тип:

public class EffectViewModel
{
    public string Name { get; set; }
    public string Category { get; set; }

    public Dictionary<ShaderType, bool> ShaderSupport { get; set; }
}

.Name и .Category уже связаны с двумя отдельными столбцами, но словарь ShaderSupport не является.

Я не могу понять, как двустороннее связывание словаря с отдельным столбцом для каждого ShaderType. Я не знаю, может ли это количество столбцов быть выполнено динамически, но я жестко закодировал их в xaml, например:

<GridViewColumn Width="60" Header="GPU" >
<GridViewColumn Width="60" Header="Pixel" >
...

Но теперь застрял на обязательной части. Есть идеи?

Ответы [ 2 ]

3 голосов
/ 01 марта 2011
<ItemsControl Grid.IsSharedSizeScope="True" ItemsSource="{Binding AllEffects}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="NameColumn" />
                        <ColumnDefinition Width="Auto" SharedSizeGroup="CategoryColumn" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding Name}" />
                    <TextBlock Text="{Binding Category}" Grid.Column="1" />
                </Grid>
                <ItemsControl ItemsSource="{Binding ShaderSupport}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel Orientation="Horizontal" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="60" />
                                </Grid.ColumnDefinitions>
                                <CheckBox Grid.Row="1" IsChecked="{Binding Value, Mode=OneWay}" />
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Это создаст сетку без заголовка. Чтобы установить флажок в режиме TwoWay, замените словарь собственным типом, KeyValuePair не позволяет записать свойство Value и, следовательно, не может использоваться для привязки TwoWay.

Обратите внимание, что у каждого EffectVM должны быть все шейдеры в словаре в одинаковом порядке.

1 голос
/ 01 марта 2011

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

<ListView ItemsSource="{Binding ShaderSupport}">
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Width="60" Header="Key" DisplayMemberBinding="{Binding Key}" />
                <GridViewColumn Width="60" Header="Value" DisplayMemberBinding="{Binding Value}" />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>
...