Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Datagrid Combobox将选定项值绑定到Textbox_C#_Wpf_Xaml_Combobox_Datagrid - Fatal编程技术网

C# Datagrid Combobox将选定项值绑定到Textbox

C# Datagrid Combobox将选定项值绑定到Textbox,c#,wpf,xaml,combobox,datagrid,C#,Wpf,Xaml,Combobox,Datagrid,希望你做得很好,并作为大师编码 接下来是Datagrid绑定问题,这让我痛苦了两天。我问了另外一个与这个问题相关的问题并解决了它,但这里是另一个问题 我有RawVal结构和Signal类(有observeCollection) 当用户选择“尾门钥匙触发器”时,文本框中显示3。选择“无远程RQ触发器”时,0 欢迎提出任何建议和解决方案, 谢谢。我创建了一个基于MVVM的简单解决方案,以指导您如何实现 ViewModel类 class ViewModel : INotifyPropertyChang

希望你做得很好,并作为大师编码

接下来是Datagrid绑定问题,这让我痛苦了两天。我问了另外一个与这个问题相关的问题并解决了它,但这里是另一个问题

我有RawVal结构和Signal类(有observeCollection)

当用户选择“尾门钥匙触发器”时,文本框中显示3。选择“无远程RQ触发器”时,0

欢迎提出任何建议和解决方案,
谢谢。

我创建了一个基于MVVM的简单解决方案,以指导您如何实现

ViewModel类

class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ObservableCollection<Signal> _source;
    public IEnumerable<Signal> MySource
    {
        get { return _source; }
    }

    private RawVal _rawValSelected;
    public RawVal RawValSelected
    {
        get { return _rawValSelected; }
        set
        {
            _rawValSelected = value;

            RaisePropertyChanged("RawValSelected");
        }
    }

    public void RaisePropertyChanged(string propName)
    {
        var pc = PropertyChanged;
        if (pc != null)
        {
            pc(this, new PropertyChangedEventArgs(propName));
        }
    }

    public ViewModel()
    {
        _source = new ObservableCollection<Signal>
        {
            new Signal{
                Name = "Test",
                Value = 1,
                rawValue = new ObservableCollection<RawVal>
                {
                    new RawVal{name="Search Key Trigger",value=4},
                    new RawVal{name="Tailgate Key Trigger",value=3},
                    new RawVal{name="Un-Lock Key Trigger",value=2},
                    new RawVal{name="Lock Key Trigger",value=1},
                    new RawVal{name="No Remote RQ Trigger",value=0}
                }
            }
        };
    }
}

您必须为
信号
执行
INotifyPropertyChanged
事件,并使用
组合框
SelectedItem
属性设置
文本框
专栏

Xaml代码:

<DataGrid ItemsSource="{Binding}" Name="grdSignal" Grid.Row="1" CanUserAddRows="False" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="            Signal Name" Binding="{Binding Name}" Width="150"/>
        <DataGridTemplateColumn Header="   Physical Value " Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox  ItemsSource="{Binding rawValue, Mode=OneWay}" SelectedItem="{Binding SelectedRaValue, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}"  DisplayMemberPath="name" Name="cmbVal"
                             Visibility="{Binding Path=rawValue.Count, Converter={StaticResource ComboBoxItemCountToEnabledConverter}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="    Value " Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding ComboValue}"  />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

希望这有帮助

谢谢你的关注,兄弟,但还有一个问题。在您的代码中,如果有几行,则会出错。当一个组合框更改时,更改将影响所有文本框,并且它们更改为相同的值。
4 - Search Key Trigger
3 - Tailgate Key Trigger
2 - Un-Lock Key Trigger 
1 - Lock Key Trigger
0 - No Remote RQ Trigger
class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ObservableCollection<Signal> _source;
    public IEnumerable<Signal> MySource
    {
        get { return _source; }
    }

    private RawVal _rawValSelected;
    public RawVal RawValSelected
    {
        get { return _rawValSelected; }
        set
        {
            _rawValSelected = value;

            RaisePropertyChanged("RawValSelected");
        }
    }

    public void RaisePropertyChanged(string propName)
    {
        var pc = PropertyChanged;
        if (pc != null)
        {
            pc(this, new PropertyChangedEventArgs(propName));
        }
    }

    public ViewModel()
    {
        _source = new ObservableCollection<Signal>
        {
            new Signal{
                Name = "Test",
                Value = 1,
                rawValue = new ObservableCollection<RawVal>
                {
                    new RawVal{name="Search Key Trigger",value=4},
                    new RawVal{name="Tailgate Key Trigger",value=3},
                    new RawVal{name="Un-Lock Key Trigger",value=2},
                    new RawVal{name="Lock Key Trigger",value=1},
                    new RawVal{name="No Remote RQ Trigger",value=0}
                }
            }
        };
    }
}
<DataGrid ItemsSource="{Binding MySource}" Name="grdSignal" CanUserAddRows="False" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Signal Name" Binding="{Binding Name}" Width="150" />
        <DataGridTemplateColumn Header="Physical Value " Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding rawValue}"
                              SelectedItem="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}},Path=DataContext.RawValSelected}"
                              DisplayMemberPath="name" SelectedIndex="0" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="Value" Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}},Path=DataContext.RawValSelected.value}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }
}
<DataGrid ItemsSource="{Binding}" Name="grdSignal" Grid.Row="1" CanUserAddRows="False" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="            Signal Name" Binding="{Binding Name}" Width="150"/>
        <DataGridTemplateColumn Header="   Physical Value " Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox  ItemsSource="{Binding rawValue, Mode=OneWay}" SelectedItem="{Binding SelectedRaValue, Mode=TwoWay,  UpdateSourceTrigger=PropertyChanged}"  DisplayMemberPath="name" Name="cmbVal"
                             Visibility="{Binding Path=rawValue.Count, Converter={StaticResource ComboBoxItemCountToEnabledConverter}}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTemplateColumn Header="    Value " Width="100">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding ComboValue}"  />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
public class Signal: INotifyPropertyChanged 
{
    public string Name 
    {
        get;
        set;
    }
    public Int32 Value 
    {
        get;
        set;
    }
    private ObservableCollection < RawVal > rawValue1;
    public ObservableCollection < RawVal > rawValue 
    {
        get 
        {
            return rawValue1;
        }
        set 
        {
            rawValue1 = value;
            OnPropertyChanged("rawValue");
            if (value != null && value.Count > 0) 
            {
                SelectedRaValue = value.First();
            }
        }
    }

    private RawVal selectedRaValue;
    public RawVal SelectedRaValue 
    {
        get 
        {
            return selectedRaValue;
        }
        set 
        {
            selectedRaValue = value;
            OnPropertyChanged("SelectedRaValue");
            ComboValue = value.name;
            OnPropertyChanged("ComboValue");
        }
    }

    public string ComboValue 
    {
        get;
        set;
    }

    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName) 
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    #endregion
}
 List < Signal > collection = new List < Signal > ();
 collection.AddRange((new[] 
 {
    new Signal
    {
        Name = "Hello",
        Value = 1,
        rawValue = new ObservableCollection < RawVal > ((new[] {
            new RawVal { name = "A", value = 1}, 
            new RawVal {name = "B", value = 1}
        }).ToList()),
    },
    new Signal {
        Name = "World",
        Value = 2,
        rawValue = new ObservableCollection < RawVal > ((new[] {
            new RawVal {name = "A", value = 1}, 
            new RawVal {name = "B", value = 1}
        }).ToList()),
    }
 }).ToList());

 this.DataContext = collection;