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>
编辑:工作得更好,但仍不完美:
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>