GridView ComboBox - 绑定所选元素 属性

GridView ComboBox - Bind selected element property

编辑:工作得更好,但仍不完美:

SelectedFace 已设置为 ComboElement(如果没有此附加参数,仍然无法完成这项工作)。

仍然不工作:当我创建一个新工具时,SelectedFace 被正确更新,但如果我想编辑一个现有的,则没有进行更新(没有绑定)。

结束编辑

我有一个 GridView,其中有一个 ComboBox select 每个工具位于哪个面上。

我无法设法将 selected 值绑定到我的对象 属性。

这是在我的 Tool 对象中声明的属性:

    private long face = 0;
    public long Face
    {
        get { return face; }
        set
        {
            this.face = value;
            this.NotifyPropertyChanged("Face");
        }
    }
    private ComboElement selectedFace;
    public ComboElement SelectedFace
    {
        get { return selectedFace; }
        set
        {
            this.selectedFace = value;
            this.Face = value.MyInt;
            this.NotifyPropertyChanged("SelectedFace");
        }
    }

    private ObservableCollection<ComboElement> comboFaceSlot=new ObservableCollection<ComboElement> { new ComboElement { MyInt = 0, MyString = "Web" }, new ComboElement { MyInt = 1, MyString = "Top" }, new ComboElement { MyInt = 2, MyString = "Bottom" }, new ComboElement { MyInt = 3, MyString = "Back" } };
    public ObservableCollection<ComboElement> ComboFaceSlot
    {
        get { return comboFaceSlot; }
        set
        {
            this.comboFaceSlot = value;
            this.NotifyPropertyChanged("ComboFaceSlot");
        }
    }

注意 : 一开始我没有 SelectedFace 属性,我添加它以为这会解决我的问题,但没有。

而XAML如下:

<DataGrid Grid.Row="1" Margin="5" BorderBrush="{StaticResource WindowBorderColor}" BorderThickness="3" Width="Auto"  ItemsSource="{Binding Path=ListTools}" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" HorizontalAlignment="Center">
    <DataGrid.Columns>
        <DataGridTextColumn Header="{x:Static p:Resources.Length}" Binding="{Binding Path=Longueur}" Width="100" />
        <DataGridTextColumn Header="{x:Static p:Resources.Diameter}" Binding="{Binding Path=Diameter}" Width="100" />

        <DataGridTemplateColumn Header="{x:Static p:Resources.Face}">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{Binding ComboFaceSlot}" DisplayMemberPath="MyString" SelectedItem="{Binding SelectedFace}" Width="100" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="{x:Static p:Resources.Angle}" Binding="{Binding Path=Angle}" Width="100" />
    </DataGrid.Columns>
</DataGrid>

还忘了,我的 ComboElement 用于我项目的所有组合框:

public class ComboElement
{
    private long myInt=-1;
    public long MyInt
    {
        get { return myInt; }
        set { myInt = value; }
    }
    private string myString="";
    public string MyString
    {
        get { return myString; }
        set { myString = value; }
    }
    public ComboElement()
    {

    }
    public ComboElement(long id, string name)
    {
        this.myInt = id;
        this.MyString = name;
    }

}

编辑:我的视图模型

private ObservableCollection<Tool> listTool = new ObservableCollection<Tool>();
public ObservableCollection<Tool> ListTool
{
    get { return listTool; }
    set
    {
        this.listTool = value;
        NotifyPropertyChanged("ListTool");
    }
}
private Machine cnc = new Machine();
public Machine CNC
{
   get { return cnc; }
   set { this.cnc = value;NotifyPropertyChanged("CNC"); }
}
public TableTools(Machine cnc)
{
    InitializeComponent();
    this.CNC = cnc;
    foreach(Tool slot in CNC.ListTool)
    {
        this.ListTool.Add(slot);
    }

    DataContext = this;
}

它列出了一个工具列表,我想说每个元素位于哪个面上。 但是现在出了点问题,我尝试使用我的 ComboBox 的几个属性作为 SelectedItem、SelectedValue、SelectedValuePath,但直到现在都没有设法解决它。 理想情况下,我想删除 "SelectedFace" 元素,并仅使用 "Face" 属性.

您需要在您的问题中指定工具 class。

根本原因是没有指定 ComboElement 对象的正确 SelectedValuePath 映射到 Tool 对象的面 属性 作为 SelectedValue .

工具Class

public class Tool
{
    private ObservableCollection<ComboElement> comboFaceSlot = new ObservableCollection<ComboElement> { new ComboElement { MyInt = 0, MyString = "Web" }, new ComboElement { MyInt = 1, MyString = "Top" }, new ComboElement { MyInt = 2, MyString = "Bottom" }, new ComboElement { MyInt = 3, MyString = "Back" } };
    public ObservableCollection<ComboElement> ComboFaceSlot
    {
        get { return comboFaceSlot; }
        set
        {
            this.comboFaceSlot = value;
            this.NotifyPropertyChanged("ComboFaceSlot");
        }
    }

    private long face = 0;
    public long Face
    {
        get { return face; }
        set
        {
           this.face = value;
           this.NotifyPropertyChanged("Face");
        }
    }
}

工具窗口视图

<DataGrid Grid.Row="1" Margin="5" BorderBrush="{StaticResource WindowBorderColor}" BorderThickness="3" Width="Auto"  ItemsSource="{Binding Path=ListTools}" AutoGenerateColumns="False" CanUserAddRows="True" CanUserDeleteRows="True" HorizontalAlignment="Center">
    <DataGrid.Columns>
        <DataGridTextColumn Header="{x:Static p:Resources.Length}" Binding="{Binding Path=Longueur}" Width="100" />
        <DataGridTextColumn Header="{x:Static p:Resources.Diameter}" Binding="{Binding Path=Diameter}" Width="100" />

        <DataGridTemplateColumn Header="{x:Static p:Resources.Face}">
            <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <ComboBox ItemsSource="{Binding ComboFaceSlot}"  
                          DisplayMemberPath="MyString" 
                          SelectedValuePath="MyInt"
                          SelectedValue="{Binding Face, UpdateSourceTrigger=PropertyChanged}" Width="100" />
            </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    <DataGridTextColumn Header="{x:Static p:Resources.Angle}" Binding="{Binding Path=Angle}" Width="100" />
</DataGrid.Columns>