2

ComboBox を DataGrid の Selected Item にバインドする例はありますか? 私はたくさんの方法を試しましたが、うまくいかないようです。私はMVVMにかなり慣れていないので、何か間違ったことをしています。どんな助けでも大歓迎です。コンボボックスがデータグリッドに設定されているグリッドのデータコンテキストがありますが、データグリッドから行を選択してもコンボボックスは変更されません。すべてのテキスト ボックスにデータグリッドからのデータが取り込まれますが、コンボ ボックスは変更されません。問題のコンボボックスは cmbRoles です。

ありがとうございました、

RG

XAML は次のとおりです。

<UserControl x:Class="Compliance.Views.UserAdministrationView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Compliance"
         xmlns:views="clr-namespace:Compliance.Views"
         xmlns:helpers="clr-namespace:Compliance.Helpers"
         xmlns:vm="clr-namespace:Compliance.ViewModels"
         xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
         mc:Ignorable="d" 
         d:DesignHeight="1000" d:DesignWidth="800">
<UserControl.Resources>
    <helpers:ActiveStatusConverter x:Key="ActiveStatusConverter"/>
</UserControl.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="0" Margin="15">
        <Label Content="User" Height="25" FontSize="14" HorizontalContentAlignment="Center" />
        <Grid HorizontalAlignment="Center" VerticalAlignment="Top" DataContext="{Binding ElementName=usersDG, Path=SelectedItem}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" MinHeight="35" />
            </Grid.RowDefinitions>
            <telerik:Label Content="User Name: " Grid.Column="0" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center" />
            <TextBox Grid.Column="1" Grid.Row="0" MinHeight="23" HorizontalAlignment="Left" VerticalAlignment="Center" MinWidth="180" MaxWidth="180" >
                <TextBox.Text>
                    <Binding Path="UserName" Mode="TwoWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/>
                </TextBox.Text>                    
            </TextBox> 
            <telerik:Label Content="First Name: " Grid.Column="2" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center" />
            <TextBox Grid.Column="3" Grid.Row="0" MinHeight="23" HorizontalAlignment="Left" VerticalAlignment="Center" MinWidth="180" MaxWidth="180">
            <TextBox.Text>
                <Binding Path="FirstName" Mode="TwoWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/>
            </TextBox.Text>
            </TextBox>
            <telerik:Label Content="Last Name: " Grid.Column="4" Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center" />
            <TextBox Grid.Column="5" Grid.Row="0" MinHeight="23" HorizontalAlignment="Left" VerticalAlignment="Center" MinWidth="180" MaxWidth="180">
            <TextBox.Text>
                <Binding Path="LastName" Mode="TwoWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/>
            </TextBox.Text>
            </TextBox>
            <telerik:Label Content="Email: " Grid.Column="0" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" />
            <TextBox Grid.Column="1" Grid.Row="1" MinHeight="23" HorizontalAlignment="Left" VerticalAlignment="Center" MinWidth="180" MaxWidth="180">
                <TextBox.Text>
                    <Binding Path="Email" Mode="TwoWay" ValidatesOnDataErrors="True" NotifyOnValidationError="True"/>
                </TextBox.Text>
            </TextBox>
            <telerik:Label Content="Active Status: " Grid.Column="2" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" />
            <telerik:RadComboBox x:Name="comBoxActiveStatus" Grid.Column="3" Grid.Row="1" MinHeight="23" MinWidth="180" HorizontalAlignment="Left" VerticalAlignment="Center"
                    SelectedItem="{Binding Path=ActiveStatus, 
                                    Converter={StaticResource ResourceKey=ActiveStatusConverter}, 
                                    Mode=TwoWay, 
                                    ValidatesOnExceptions=True, 
                                    NotifyOnValidationError=True}">
            </telerik:RadComboBox>
            <telerik:Label Content="Role: " Grid.Column="4" Grid.Row="1" HorizontalAlignment="Right" VerticalAlignment="Center" />
            <telerik:RadComboBox x:Name="cmbRoles" DisplayMemberPath="RoleName" 
                        Grid.Column="5" 
                        Grid.ColumnSpan="3"
                        Grid.Row="1" 
                        MinHeight="23" 
                        HorizontalAlignment="Left" 
                        ItemsSource="{Binding}" 
                        Margin="5" 
                        VerticalAlignment="Center" 
                        MinWidth="180" 
                        SelectedItem="{Binding RoleName}"
                        IsSynchronizedWithCurrentItem="True">
            </telerik:RadComboBox>
            <Button Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="3" Content="Save User" Width="100"  />
            <Button Grid.Column="4" Grid.Row="2" Grid.ColumnSpan="3" Content="Add User"  Width="100"  />
        </Grid>
    </StackPanel>
    <Border CornerRadius="10" BorderThickness="5" Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Center">
        <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Label Content="Users" Grid.Row="0" Height="25" FontSize="14" HorizontalContentAlignment="Center" />
            <telerik:RadGridView x:Name="usersDG" ItemsSource="{Binding Users}" AutoGenerateColumns="False" ShowGroupPanel="False" IsReadOnly="True">
                <telerik:RadGridView.Columns>
                    <telerik:GridViewDataColumn DataMemberBinding="{Binding UserName}" Header="User Name" />
                    <telerik:GridViewDataColumn DataMemberBinding="{Binding FirstName}" Header="First Name" />
                    <telerik:GridViewDataColumn DataMemberBinding="{Binding LastName}" Header="Last Name" />
                    <telerik:GridViewDataColumn DataMemberBinding="{Binding Email}" Header="Email" />
                    <telerik:GridViewDataColumn DataMemberBinding="{Binding Role.RoleName}" Header="Role Name" />
                    <telerik:GridViewDataColumn DataMemberBinding="{Binding ActiveStatus, Converter={StaticResource ActiveStatusConverter}}" Header="Active Status" />
                </telerik:RadGridView.Columns>
            </telerik:RadGridView>
        </Grid>
    </Border>
</Grid>

4

2 に答える 2

2

上記のハンニッシュの回答を拡張して別の見方をすると、マスター詳細タイプの配置を使用していると仮定します。ここでは、詳細 DataContext を DataGrid の選択された行に設定します。

このセットアップでも、ComboBox Binding で多くの問題が発生しました。

私は自分のアプリケーションに Telerik コントロールを使用していませんが、DataGrid の選択された行のプロパティを作成し、詳細をこれにバインドする傾向があります。

DataGrid XAML は次のようになります。

<DataGrid x:Name="grdResults" 
    DataContext="{Binding DataGridDataContextCollection}" 
    ItemsSource="{Binding}"
    SelectedItem="{Binding DataContext.SelectedRow, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">

DataGrid DataContext 内の項目を実行する行に対して設定した動作があるので、このようにします。

次に、Selected ComboBox アイテムのプロパティも用意し、ComboBox をこれにバインドします。

ComboBox ItemSource の場合、問題は、ComboBox をバインドする必要があるアイテムの ObservableCollection があることですが、これらはもちろん DataGrid Selected Row のメンバーではなく、詳細 DataContext ではありません。

そのため、ComboBox の ItemSource と SelectedItem をバインドするには、Details の DataContext ではなく、View の DataContext を参照する必要があります。

DataGrid DataContext で使用できる場合は、ComboBox Text プロパティも DataGrid SelectedRow Name 値にバインドします (2 つが同じであると仮定します)。これにより、更新された DataGrid も更新されます。

ComboBox に使用する XAML は次のようなものです。

<ComboBox x:Name="cmbRoles" 
    SelectedItem="{Binding DataContext.SelectedRole, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" 
    SelectedValuePath="Role_ID" 
    SelectedValue="{Binding Role_ID, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}"
    ItemsSource="{Binding DataContext.RoleItems, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" 
    Text="{Binding RoleName, Mode=TwoWay}"
    DisplayMemberPath="RoleName" 
    IsSynchronizedWithCurrentItem="True" 
    HorizontalAlignment="Left"/>

100% 確実にするために、ComboBox SelectedItem セッター内から DataGrid SelectedRow ID 値を設定して、ComboBox SelectedItem を DataGrid SelectedRow に同期します。もちろん、これは厳密には必要ではありません。

これが役立つことを願っています!

于 2013-01-03T20:07:19.627 に答える
0

私が正しく理解していれば、すべてのユーザーを含むRadGridViewと、選択した行の値を編集するある種の詳細フォームがあります。

したがって、いくつか変更する必要があります。

1:コンボボックスのItemsSourceは{Binding}に設定されているため、親要素のdatacontextにバインドして、アイテムリストを取得します。この場合、親は、DataContextがRadGridの選択されたアイテムに(正しく)設定されたグリッドです(ここでは、DataContext = "{Binding ElementName = usersDG、Path = SelectedItem}"、問題ありません)。

問題は、ComboBoxのItemsSourceに可能なロールのリストを入力する必要があることです。私は通常、そのようなリストに静的なObservableCollectionを使用します(したがって、アプリケーション全体で同じであることを確認します)。このようなもの:

ItemsSource = "{x:Static local:Lists.RolesList}"

列挙型などがあるかもしれませんが、重要なことは、ItemsSourceプロパティに選択可能なすべてのオプションを設定することです。

2:コンボボックスのリストにRoleオブジェクトを入力するため、SelectedItemはそのようなオブジェクトにバインドする必要があります。このオブジェクトは、Userオブジェクト内にパブリックプロパティ(INPCまたはDependecyPropertyを使用)として存在する必要があります。次のように設定する必要があります。

SelectedItem = "{Binding Role、Mode = TwoWay}"

コンボのデータコンテキストは、RadGridで選択されているUserオブジェクトであることに注意してください。ユーザークラスには、プロパティRoleが必要です。

それでうまくいくと思います。他に問題があれば教えてください。よろしくお願いします!

于 2013-01-03T19:02:03.390 に答える