我正在尝试使用WPF组合框(在WPFToolkit Datagrid中),并且我无法正确对齐所有部分。我正在使用Linq to Entities,我将整个datacontext设置为Linq查询的结果:
private void LoadDonationGrid()
{
donationGrid.ItemsSource = from donations in entities.Donation
.Include("Family")
.Include("PledgeYear")
.Include("DonationPurpose")
from donationPurposes in entities.DonationPurpose
select new { donations, donationPurposes };
}
我的代码隐藏中也有一个页面属性,它为组合框提供了ItemsSource:
private IEnumerable donationPurposeList;
public IEnumerable DonationPurposeList
{
get
{
if (donationPurposeList == null)
{
donationPurposeList = from dp in entities.DonationPurpose
select dp;
}
return donationPurposeList.ToList();
}
}
组合框的XAML如下所示:
<tk:DataGridTemplateColumn Header="Purpose">
<tk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=donations.DonationPurpose.Description, Mode=TwoWay}" />
</DataTemplate>
</tk:DataGridTemplateColumn.CellTemplate>
<tk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox Name="cboDonationPurpose"
SelectedValue="{Binding Path=donations.DonationPurposeID, Mode=TwoWay}"
ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Page},Mode=FindAncestor},Path=DonationPurposeList}"
DisplayMemberPath="Description"
SelectedValuePath="DonationPurposeID"
/>
</DataTemplate>
</tk:DataGridTemplateColumn.CellEditingTemplate>
</tk:DataGridTemplateColumn>
并且一切似乎都正常工作,即,适当的值显示在ComboBox中,直到焦点离开ComboBox的点。此时,显示的值将返回原始值,而不是新选择的值。我已经尝试使用SelectedItem而不是SelectedValue,但最终选择的值不会显示在ComboBox中。我有点神秘:似乎这一点应该有效。
2009年3月2日编辑:我仍然对此感到困惑。我应该注意,在我的数据网格中,任何简单的数据列(例如“DataGridTextColumn”)都会像您期望的那样更新底层数据源。但是对我的任何模板化列(“DataGridTemplateColumn”)或ComboBox列(“DataGridComboBoxColumn”)的任何更新都不起作用:底层数据源永远不会更新。当然其他人已经尝试使用WPF.Toolkit数据网格并使这个场景起作用 - 但我已经查看了所有的示例代码,而且我基本上在做它所说的事情(在我的约束下)解决方案),所以我很难理解为什么这不起作用。
有什么想法吗?
答案 0 :(得分:22)
我遇到了类似的问题(我花了好几天的挫折感),我发现将UpdateSourceTrigger
绑定到SelectedValue
更改为PropertyChanged
修复了它。我不知道为什么,但对我来说,数据源在我做出这个改变之前没有更新。
<ComboBox
ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UpdateTypesManager:MainWindow}}, Path=CardinalityTypes}"
DisplayMemberPath="CardinalityType"
SelectedValue="{Binding CardinalityTypeId, UpdateSourceTrigger=PropertyChanged}"
SelectedValuePath="Id" />
答案 1 :(得分:6)
我能够让这个工作。但是我的设置有点不同。
由于我不知道您的数据源是什么,我自己编写了模拟基本问题:在WPF DataGrid中正确绑定comboBox。
以下是我的视图模型的组成:
public class RootViewModel
{
public List<State> USStates { get; set; }
public List<Customer> Customers { get; set; }
public ViewModel()
{
Customers = new List<Customer>();
Customers.Add(new Customer() { FirstName = "John", LastName = "Smith", State = new State() { ShortName = "IL" } });
Customers.Add(new Customer() { FirstName = "John", LastName = "Doe", State = new State() { ShortName = "OH" } });
Customers.Add(new Customer() { FirstName = "Sally", LastName = "Smith", State = new State() { ShortName = "IN" } });
USStates = new List<State>();
USStates.Add(new State() { ShortName = "OH" });
USStates.Add(new State() { ShortName = "IL" });
USStates.Add(new State() { ShortName = "IN" });
}
}
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }
public State State { get; set; }
}
public class State
{
public string ShortName { get; set; }
public State()
{
ShortName = string.Empty;
}
public override bool Equals(object obj)
{
if (obj is State)
{
State otherState = obj as State;
return ShortName.Equals(otherState.ShortName);
}
else
{
return false;
}
}
}
在开始之前,我将我的Window的DataContext设置为正确构造的RootViewModel的实例。
<tk:DataGrid ItemsSource="{Binding Customers}" AutoGenerateColumns="False">
<tk:DataGrid.Columns>
<tk:DataGridTemplateColumn Header="State">
<tk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=State.ShortName, Mode=TwoWay}" />
</DataTemplate>
</tk:DataGridTemplateColumn.CellTemplate>
<tk:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox
x:Name="cboDonationPurpose"
SelectedItem="{Binding Path=State, Mode=TwoWay}"
ItemsSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window},Mode=FindAncestor}, Path=DataContext.USStates}"
DisplayMemberPath="ShortName"
SelectedValuePath="ShortName" />
</DataTemplate>
</tk:DataGridTemplateColumn.CellEditingTemplate>
</tk:DataGridTemplateColumn>
</tk:DataGrid.Columns>
</tk:DataGrid>
为了使SelectedItem正确绑定,我需要确保我已经覆盖了我的实体上的Equals方法,因为WPF正在使用此方法来确定谁是SelectedItem。我认为这从根本上说是你的问题从一开始就导致你试图绑定到SelectedValue而不是SelectedItem。
答案 2 :(得分:0)
您需要添加
IsSynchronizedWithCurrentItem = "True"
在您的Xaml中。
就这么简单......