0

2つのDataGridComboxClolumn要素を持つデータグリッドがあり、最初の値が変更されたときに2番目のItemsSourceを変更したいと思います。どうすればそのようなバインディングを設定できますか?

注:データグリッドには独自のitemssourceがあり、データは次のように階層化されています。

データグリッドのItemsSource(リスト操作タイプチャネル):

public class Root
{
    public List<Channel> Ch { get; set; }  // This is the ItemsSource of the datagrid itself
}


public class Channel
{
    public Settings TheSettings { get; set; }
}

私が達成したいのは、TheSettingsが2番目のComboBoxの選択された値で設定されることです。これは、ComboBoxItemsSourceを設定することで簡単に実行できます。2番目のcomboxのItemsSourceが動的である必要がありますが。たとえば、FIRSTコンボボックスで選択されたソースに変更する必要があります。これはどのように行うことができますか?

4

1 に答える 1

1

オプション1

2つのコンボボックスを使用してDataGridTemplateColumnを作成できます。最初のアイテムにはメインのViewModelのアイテムを入力でき、2番目のアイテムは最初のSelectedItemのアイテムにバインドされます。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:local="clr-namespace:WpfApplication1"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="525"
    Height="350"
    mc:Ignorable="d">
<Window.DataContext>
    <local:Root/>
</Window.DataContext>
<Grid x:Name="LayoutRoot">
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Ch}" CanUserAddRows="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>
                        <ComboBox  Width="100" ItemsSource="{Binding DataContext.ComboBox1Items, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" x:Name="ComboBox1"/>
                        <ComboBox Grid.Column="1" Width="100" ItemsSource="{Binding SelectedItem.Items, ElementName=ComboBox1}" SelectedItem="{Binding TheSettings}" IsEditable="True" IsReadOnly="True"/>
                        </Grid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>

</Grid>
</Window>

public class ComboBox1Item
{
    public string Label { get; set; }
    public List<string> Items { get; set; }

    public override string ToString()
    {
        return this.Label;
    }
}

public class Root
{
    public List<Channel> Ch { get; set; }

    public List<ComboBox1Item> ComboBox1Items { get; set; }

    public Root()
    {
        this.Ch = new List<Channel>(){
            new Channel(){ TheSettings = "Settings1"},
            new Channel(){ TheSettings = "Settings2"},
        };

        this.ComboBox1Items = new List<ComboBox1Item>{
            new ComboBox1Item(){ Label = "Item1",
                Items = new List<string>(){ "Settings1", "Settings2"}
            },
            new ComboBox1Item(){ Label = "Item2",
                Items = new List<string>(){ "Settings3", "Settings4"}
            }
        };
    }
}

オプション2

Channelオブジェクトをラップするオブジェクトを作成し、その中に1つのコンボボックスが他のコンボボックスのアイテムを駆動できるようにするロジックを配置します。

public class ChannelWrapper : INotifyPropertyChanged
{
    #region INotifyPropertyChanged values

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion


    private object comboBox1SelectedItem;
    public object ComboBox1SelectedItem
    {
        get { return this.comboBox1SelectedItem; }
        set
        {
            if (this.comboBox1SelectedItem != value)
            {
                this.comboBox1SelectedItem = value;
                this.OnPropertyChanged("ComboBox1SelectedItem");

                // Put the logic to change the items available in the second combobox here
                if (value == "Value1")
                    this.ComboBox2ItemsSource = new List<object>() { "Setting1", "Setting2" };
                if (value == "Value2")
                    this.ComboBox2ItemsSource = new List<object>() { "Setting3", "Setting4" };
            }
        }
    }

    private List<object> comboBox2ItemsSource;
    public List<object> ComboBox2ItemsSource
    {
        get { return this.comboBox2ItemsSource; }
        set
        {
            if (this.comboBox2ItemsSource != value)
            {
                this.comboBox2ItemsSource = value;
                this.OnPropertyChanged("ComboBox2ItemsSource");
            }
        }
    }

    public Channel Ch { get; set; }
}

次に、Rootクラスは、チャネルのコレクションではなく、ラッパーのコレクションを公開します。DataGridには2つのComboBoxColumnsがあります。最初のSelectedItemは、ラッパーのプロパティ「ComboBox1SelectedItem」にバインドされます。2番目のItemsSourceは、ラッパーのプロパティ「ComboBox2ItemsSource」にバインドされ、2番目の列のSelectedItemは、パス「Ch.TheSettting」を使用して、ラッパーのChannelインスタンスの設定にバインドされます。

于 2012-12-12T15:41:02.250 に答える