0

XAMLにDataGrid2 つの s が設定されています (ここDataGridComboBoxColumnからコピー):

<DataGrid x:Name="joinGrid" AutoGenerateColumns="False" CanUserAddRows="True">
                <DataGrid.Columns>
                    <DataGridComboBoxColumn>
                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="IsDropDownOpen" Value="True" />
                                <Setter Property="ItemsSource" Value="{Binding Path=TableAColumns}" />
                                <Setter Property="ItemTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"></TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>
                        <DataGridComboBoxColumn.EditingElementStyle >
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding Path=TableAColumns}" />
                                <Setter Property="IsDropDownOpen" Value="True" />
                                <Setter Property="ItemTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"></TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridComboBoxColumn.EditingElementStyle>
                    </DataGridComboBoxColumn>

                    <DataGridComboBoxColumn>
                        <DataGridComboBoxColumn.ElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="IsDropDownOpen" Value="True" />
                                <Setter Property="ItemsSource" Value="{Binding Path=TableBColumns}" />
                                <Setter Property="ItemTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"></TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridComboBoxColumn.ElementStyle>
                        <DataGridComboBoxColumn.EditingElementStyle>
                            <Style TargetType="ComboBox">
                                <Setter Property="ItemsSource" Value="{Binding Path=TableBColumns}" />
                                <Setter Property="IsDropDownOpen" Value="True" />
                                <Setter Property="ItemTemplate">
                                    <Setter.Value>
                                        <DataTemplate>
                                            <TextBlock Text="{Binding}"></TextBlock>
                                        </DataTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </DataGridComboBoxColumn.EditingElementStyle>
                    </DataGridComboBoxColumn>
                </DataGrid.Columns>
            </DataGrid>

正直なところ、欠落しているプロパティに何を入れるべきか理解していないため、いくつかの例外があります。エンティティ クラスに含まれる文字列のリストに列をバインドしようとしています。

class JoinBlockDTO
{
    public List<string> TableAColumns { get; set; }
    public List<string> TableBColumns { get; set; }
}

私のコード ビハインドでは、グリッドのItemsSource:

DataGrid dg = (DataGrid)GetTemplateChild("joinGrid");

List<JoinBlockDTO> l = new List<JoinBlockDTO>();
List<string> colAList = (from DataRowView row in sourceA
                         select row.Row.Field<string>(0)).ToList();
List<string> colBList = (from DataRowView row in sourceB
                         select row.Row.Field<string>(0)).ToList();

((DataGridComboBoxColumn)dg.Columns[0]).ItemsSource = colAList; //doesn't work without this
((DataGridComboBoxColumn)dg.Columns[1]).ItemsSource = colBList; //doesn't work without this
l.Add (new JoinBlockDTO(){TableAColumns = colAList, TableBColumns = colBList});
dg.ItemsSource = l;

これにより、最初は、すべてのセルが空白の 2 x 2 グリッドがレンダリングされます。2 回クリックすると、適切にバインドされた文字列のリストが表示されたドロップダウンが表示されます。ただし、ドロップダウンから値を選択してフォーカスを外側に移動すると、セルは空白のままになります。XAML に何を追加または変更する必要があるかを指摘できますか? このバインディングを行う簡単な方法はありますか? このコンボ ボックスの列バインディングに関する多数の投稿を読みましたが、何が起こっているのか理解できませんでした。(VS2010使用)

4

3 に答える 3

0

これはあなたを助けるでしょう

"ObservableCollection"List を使用して INotifyPropertyChanged を自動化する

 <DataGrid x:Name="myDataGridTeacher" 
                  ItemsSource="{Binding ObservableCollectionList}" >

 <DataGridTemplateColumn Width="*" Header="MyHeader"  >
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate >

                            <TextBlock Text="{Binding Material_Name.Name}" 
                                  />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

                    <DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox  
                                       ItemsSource="{Binding Material_Name}" 
                                       DisplayMemberPath="Name"

                                />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellEditingTemplate>

                </DataGridTemplateColumn>

 </DataGrid>

ItemsSource="{Binding Material_Name}" は "ObservableCollectionList" のリストです

<TextBlock Text="{Binding Material_Name.Name}" 
                                      />
于 2014-12-10T18:58:18.200 に答える
0

おそらく、VM はINotifyPropertyChangedインターフェイスを実装していません。

次に例を示します。

<Window x:Class="wpfProj.MainWindow"
        ...
        d:DataContext="{d:DesignInstance wpfProj:MainViewModel}">

    <Grid >
        <Grid.Resources>
            <wpfProj:BindingProxy x:Key="proxy" Data="{Binding}"/>
        </Grid.Resources>
        <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Persons}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="*"/>
                <DataGridComboBoxColumn Header="Sex" Width="*" ItemsSource="{Binding Source={StaticResource proxy}, Path=Data.SexList}"
                                        SelectedItemBinding="{Binding Path=Sex}"/>
                <DataGridComboBoxColumn Header="Sex" Width="*" ItemsSource="{Binding Source={x:Static wpfProj:DataCollection.Instance}, Path=SexList}"
                                        SelectedItemBinding="{Binding Path=Sex}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

ソースにバインドする 2 つの方法を示すために、2 つの「Sex」列を配置しました。最初のケースでは、SexList は ViewModel (DataContext) の一部であるため、プロキシを使用しました。2 番目のケースでは、シングルトンのプロパティにバインドされています。

性別特性:

    public string Sex
    {
        get { return _sex; }
        set
        {
            _sex = value;
            OnPropertyChanged("Sex");
        }
    }

そしてプロキシクラス(インターネットで見つけました。著者のページへのリンクを覚えていません)

public class BindingProxy : Freezable
{
    #region Overrides of Freezable

    protected override Freezable CreateInstanceCore()
    {
        return new BindingProxy();
    }

    #endregion

    public object Data
    {
        get { return GetValue(DataProperty); }
        set { SetValue(DataProperty, value); }
    }

    public static readonly DependencyProperty DataProperty =
        DependencyProperty.Register("Data", typeof(object), typeof(BindingProxy), new UIPropertyMetadata(null));
}

それが役に立てば幸い。これが私がアップロードしたサンプルです。

于 2012-08-22T10:48:38.417 に答える