C# GridView组合框-绑定选定元素属性

C# GridView组合框-绑定选定元素属性,c#,wpf,gridview,combobox,binding,C#,Wpf,Gridview,Combobox,Binding,编辑:工作更好,但仍不完美: SelectedFace已设置为ComboElement(如果没有此附加参数,仍无法执行此作业) 仍然不工作:当我创建一个新工具时,SelectedFace被正确更新,但如果我想编辑一个现有的工具,则不会进行更新(没有绑定) 结束编辑 我有一个GridView,其中有一个组合框来选择每个工具所在的面 我无法将所选值绑定到我的对象属性 以下是我的工具对象中声明的属性: private long face = 0; public long Face

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

SelectedFace已设置为ComboElement(如果没有此附加参数,仍无法执行此作业)

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

结束编辑

我有一个GridView,其中有一个组合框来选择每个工具所在的面

我无法将所选值绑定到我的对象属性

以下是我的
工具
对象中声明的属性:

    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");
        }
    }
还忘了,我的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;
    }

}
编辑:我的ViewModel

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;
}
private ObservableCollection listTool=new ObservableCollection();
公共可观察收集列表工具
{
获取{return listTool;}
设置
{
this.listTool=值;
NotifyPropertyChanged(“列表工具”);
}
}
专用机床cnc=新机床();
公共机器数控
{
获取{return;}
设置{this.cnc=value;NotifyPropertyChanged(“cnc”);}
}
公用台式工具(数控机床)
{
初始化组件();
这个.CNC=CNC;
foreach(CNC.ListTool中的刀具槽)
{
this.ListTool.Add(slot);
}
DataContext=this;
}
它列出了一个工具列表,我想说的是每个元素位于哪个面上。 但现在出现了一些问题,我尝试使用组合框的几个属性,如SelectedItem、SelectedValue、SelectedValuePath,但直到现在都没有解决这个问题。
理想情况下,我希望删除“SelectedFace”元素,只使用“Face”属性。

您需要像在问题中那样指定工具类

根本原因是没有将要映射到
工具
对象的
SelectedValuePath
对象的正确
SelectedValue路径
指定为
SelectedValue

工具类

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");
        }
    }
}
公共类工具
{
private observeCollection comboFaceSlot=new observeCollection{new combolement{MyInt=0,MyString=“Web”},new combolement{MyInt=1,MyString=“Top”},new combolement{MyInt=2,MyString=“Bottom”},new combolement{MyInt=3,MyString=“Back”};
公共可观测集合组合面槽
{
获取{return comboFaceSlot;}
设置
{
this.comboFaceSlot=值;
此.NotifyPropertyChanged(“ComboFaceSlot”);
}
}
私人长脸=0;
公众长脸
{
获取{返回面;}
设置
{
这张脸=价值;
本条。NotifyPropertyChanged(“面”);
}
}
}
工具窗口视图

<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>


您需要像在问题中那样指定工具类

根本原因是没有将要映射到
工具
对象的
SelectedValuePath
对象的正确
SelectedValue路径
指定为
SelectedValue

工具类

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");
        }
    }
}
公共类工具
{
private observeCollection comboFaceSlot=new observeCollection{new combolement{MyInt=0,MyString=“Web”},new combolement{MyInt=1,MyString=“Top”},new combolement{MyInt=2,MyString=“Bottom”},new combolement{MyInt=3,MyString=“Back”};
公共可观测集合组合面槽
{
获取{return comboFaceSlot;}
设置
{
this.comboFaceSlot=值;
此.NotifyPropertyChanged(“ComboFaceSlot”);
}
}
私人长脸=0;
公众长脸
{
获取{返回面;}
设置
{
这张脸=价值;
本条。NotifyPropertyChanged(“面”);
}
}
}
工具窗口视图

<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>


您的DataContext设置为什么?ListTool集合的单个项是否具有名为ComboFaceSlot的属性?发布完整的类和视图。DataContext设置为我的ViewModel。(可能不理解这个问题)。然后是的,正如您在我的代码中看到的,我向每个工具属性ComboFaceSlot和SelectedFace添加了属性,因为我看不到其他方法来执行此操作。@因此我错了,我的上下文是我的窗口(此),我设置了一个属性ListTool,它读取我当前机器的所有工具。(窗口名称为TableTools)您的DataContext设置为什么?ListTool集合的单个项是否具有名为ComboFaceSlot的属性?发布完整的类和视图。DataContext设置为我的ViewModel。(可能不理解这个问题)。然后是的,正如您在我的代码中看到的,我向每个工具属性ComboFaceSlot和SelectedFace添加了属性,因为我看不到其他方法来执行此操作。@因此我错了,我的上下文是我的窗口(此),我设置了一个属性ListTool,它读取我当前机器的所有工具。(窗口的名称是TableTools)我在评论中告诉过你,代码是我的对象定义的一部分,而不是窗口的一部分。好吧,所以我想说得更清楚:ComboFaceSlot、Face和SelectedFace都在我的对象(每个单独的工具)中描述,所以我为每个工具(每个网格线)都有一个ComboBox。在我的ViewModel中,我没有任何ComboFaceSlot或Face属性,只有一个ObservableCollection。不再需要
SelectedFace
,但您必须定义
SelectedValuePath
。我也尝试过(SelectedPath/SelectedValuePath),但不明白为什么,当我添加新行(新工具)时,工具是使用SelectedValue正确创建的,但是当我修改SelectedValue时,绑定没有正确进行。我在ComboBox中看到它以图形方式更改,但Face没有更新。我猜当您添加新工具时,您初始化了Face的值