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