WPF .Net 4.0 Datagrid,级联组合框在单元格更新时不级联,仅在行更新后级联
我是 WPF 新手,我发现 WPF .Net 4.0 Datagrid 似乎无法处理级联组合框。仅当焦点从行中移除后,单元格才会正确填充选择框的正确数据。实际上,我可以在行焦点丢失后看到调试点被命中,但在单元格焦点丢失时却看不到调试点。
以前的 WPF 工具包 Datagrid 似乎不会出现这种类型的行为,其中一切都按预期进行。
这里显而易见的解决方案是使用 WPF 工具包,但这是 .Net 4.0 中的一个新项目,因此向后退没有意义(也许我会重新考虑这个问题)。据我了解,WPF 工具包也有其自身的缺陷,这需要我学习并解决这些缺陷。
我在网上搜索了很多资源,但运气不佳。一个反复出现的主题似乎是单元格不是造成这种情况的视觉树的一部分(不确定这是否有效)。
非常感谢任何有关我可能错过的活动或工作示例的帮助。
提前致谢。
场景
WPF .Net 4.0 数据网格。
- 从第 1 行开始
- 。双击“国家/地区”单元格,将“中国”更改为“美国”。
- 双击“城市”单元格,注意“城市”仍然是“中国”(不是预期的)
- 将焦点移至第 2 行。
- 再次双击第 1 行的“城市”单元格,请注意“城市”已更新。纽约和华盛顿现在是选择。
WPF Toolkit
- 从第 1 行开始。
- 双击“国家/地区”单元格,将“中国”更改为“美国”
- 双击“城市”单元格,注意“城市”代表美国(预期)。
除了 WPF 工具包用法之外,两者的代码几乎相同(示例来自嘉良的博客)
代码
WPF .Net 4.0
<Window x:Class="CSWPFCascadeDataGridComboBoxColumns.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CSWPFCascadeDataGridComboBoxColumns"
Title="Cascade DataGridComboBoxColumns" Height="300" Width="300" Loaded="Window_Loaded">
<DockPanel LastChildFill="True">
<DataGrid Name="dataGrid" ItemsSource="{Binding}"
AutoGenerateColumns="False"
PreparingCellForEdit="datagrid_PreparingCellForEdit">
<DataGrid.Columns>
<DataGridComboBoxColumn x:Name="column1" Width="80"/>
<DataGridComboBoxColumn x:Name="column2" Width="80"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public enum Country
{
China,
UnitedStates
}
public enum ChinaCity
{
Beijing,
Shanghai
}
public enum UnitedStatesCity
{
NewYork,
Washington
}
DataTable table = null;
string[] strChinaCities, strUnitedStateCities;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum Country
//
Array countries = Enum.GetValues(typeof(Country));
/////////////////////////////////////////////////////////////////
// copy all Country enumeration values to a string array
//
string[] strCountries = new string[countries.Length];
for (int i = 0; i < countries.Length; i++)
{
strCountries[i] = (countries as Country[])[i].ToString();
}
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum ChinaCity
//
Array chinaCities = Enum.GetValues(typeof(ChinaCity));
/////////////////////////////////////////////////////////////////
// copy all ChinaCity enumeration values to a string array
//
strChinaCities = new string[chinaCities.Length];
for (int i = 0; i < chinaCities.Length; i++)
{
strChinaCities[i] = (chinaCities as ChinaCity[])[i].ToString();
}
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum UnitedStatesCity
//
Array unitedStateCities = Enum.GetValues(typeof(UnitedStatesCity));
/////////////////////////////////////////////////////////////////
//copy all UnitedStateCity enumeration values to a string array
//
strUnitedStateCities = new string[unitedStateCities.Length];
for (int i = 0; i < unitedStateCities.Length; i++)
{
strUnitedStateCities[i] = (unitedStateCities as UnitedStatesCity[])[i].ToString();
}
//////////////////////////////////////////////////////////////////
// combine both the two city enumeration value into one string array
//
string[] strAllCities = new string[strChinaCities.Length + strUnitedStateCities.Length];
strChinaCities.CopyTo(strAllCities, 0);
strUnitedStateCities.CopyTo(strAllCities, strChinaCities.Length);
///////////////////////////////////////////////////////////////////////////////
// data bind the two DataGridComboBoxColumn's ItemsSource property respectively
//
BindingOperations.SetBinding(this.column1, DataGridComboBoxColumn.ItemsSourceProperty,
new Binding() { Source = strCountries });
BindingOperations.SetBinding(this.column2, DataGridComboBoxColumn.ItemsSourceProperty,
new Binding() { Source = strAllCities });
/////////////////////////////////////////////////////////////////
// create a DataTable and add two DataColumn into it
//
table = new DataTable();
table.Columns.Add("Country");
table.Columns.Add("City");
/////////////////////////////////////////////////////////////////
// add a DataRow into this DataTable
//
table.Rows.Add(new object[] { "China", "Beijing" });
/////////////////////////////////////////////////////////////////
// set the DataContext property of the DataGrid to the DataTable
//
this.dataGrid.DataContext = table;
/////////////////////////////////////////////////////////////////
// set the Header of both DataGridComboBoxColumn and bind the
// SelectedItemBinding property of both DataGridComboBoxColumn
this.column1.Header = "Country";
this.column1.SelectedItemBinding = new Binding("Country");
this.column2.Header = "City";
this.column2.SelectedItemBinding = new Binding("City");
}
/// <summary>
/// this PreparingCellForEdit event handler gets the hosted editing ComboBox control
/// and bind its ItemsSource property according to the value of the Country
/// </summary>
private void datagrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
if (e.Column.Header.Equals("City"))
{
ComboBox cboEditingElement = e.EditingElement as ComboBox;
if ((e.Row.Item as DataRowView)["Country"].Equals("China"))
{
//////////////////////////////////////////////////////////////////////////
// bind the ItemsSource property of the cmbEditingElement to China city
// string array if the selected country is China
//
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty,
new Binding() { Source = strChinaCities });
}
else
{
//////////////////////////////////////////////////////////////////////////
// bind the ItemsSource property of the cmbEditingElement to United State
// city string array if the selected country is United State
//
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty,
new Binding() { Source = strUnitedStateCities });
}
}
}
}
WPF 工具包代码
MainWindow.xaml
<Window x:Class="CSWPFCascadeDataGridComboBoxColumns.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CSWPFCascadeDataGridComboBoxColumns"
xmlns:toolkit ="http://schemas.microsoft.com/wpf/2008/toolkit"
Title="Cascade DataGridComboBoxColumns" Height="300" Width="300" Loaded="Window_Loaded">
<DockPanel LastChildFill="True">
<toolkit:DataGrid Name="dataGrid" ItemsSource="{Binding}"
AutoGenerateColumns="False"
PreparingCellForEdit="datagrid_PreparingCellForEdit">
<toolkit:DataGrid.Columns>
<toolkit:DataGridComboBoxColumn x:Name="column1" Width="80"/>
<toolkit:DataGridComboBoxColumn x:Name="column2" Width="80"/>
</toolkit:DataGrid.Columns>
</toolkit:DataGrid>
</DockPanel>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public enum Country
{
China,
UnitedStates
}
public enum ChinaCity
{
Beijing,
Shanghai
}
public enum UnitedStatesCity
{
NewYork,
Washington
}
DataTable table = null;
string[] strChinaCities, strUnitedStateCities;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum Country
//
Array countries = Enum.GetValues(typeof(Country));
/////////////////////////////////////////////////////////////////
// copy all Country enumeration values to a string array
//
string[] strCountries = new string[countries.Length];
for (int i = 0; i < countries.Length; i++)
{
strCountries[i] = (countries as Country[])[i].ToString();
}
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum ChinaCity
//
Array chinaCities = Enum.GetValues(typeof(ChinaCity));
/////////////////////////////////////////////////////////////////
// copy all ChinaCity enumeration values to a string array
//
strChinaCities = new string[chinaCities.Length];
for (int i = 0; i < chinaCities.Length; i++)
{
strChinaCities[i] = (chinaCities as ChinaCity[])[i].ToString();
}
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum UnitedStatesCity
//
Array unitedStateCities = Enum.GetValues(typeof(UnitedStatesCity));
/////////////////////////////////////////////////////////////////
//copy all UnitedStateCity enumeration values to a string array
//
strUnitedStateCities = new string[unitedStateCities.Length];
for (int i = 0; i < unitedStateCities.Length; i++)
{
strUnitedStateCities[i] = (unitedStateCities as UnitedStatesCity[])[i].ToString();
}
//////////////////////////////////////////////////////////////////
// combine both the two city enumeration value into one string array
//
string[] strAllCities = new string[strChinaCities.Length + strUnitedStateCities.Length];
strChinaCities.CopyTo(strAllCities, 0);
strUnitedStateCities.CopyTo(strAllCities, strChinaCities.Length);
///////////////////////////////////////////////////////////////////////////////
// data bind the two DataGridComboBoxColumn's ItemsSource property respectively
//
BindingOperations.SetBinding(this.column1, DataGridComboBoxColumn.ItemsSourceProperty,
new Binding() { Source = strCountries });
BindingOperations.SetBinding(this.column2, DataGridComboBoxColumn.ItemsSourceProperty,
new Binding() { Source = strAllCities });
/////////////////////////////////////////////////////////////////
// create a DataTable and add two DataColumn into it
//
table = new DataTable();
table.Columns.Add("Country");
table.Columns.Add("City");
/////////////////////////////////////////////////////////////////
// add a DataRow into this DataTable
//
table.Rows.Add(new object[] { "China", "Beijing" });
/////////////////////////////////////////////////////////////////
// set the DataContext property of the DataGrid to the DataTable
//
this.dataGrid.DataContext = table;
/////////////////////////////////////////////////////////////////
// set the Header of both DataGridComboBoxColumn and bind the
// SelectedItemBinding property of both DataGridComboBoxColumn
this.column1.Header = "Country";
this.column1.SelectedItemBinding = new Binding("Country");
this.column2.Header = "City";
this.column2.SelectedItemBinding = new Binding("City");
}
/// <summary>
/// this PreparingCellForEdit event handler gets the hosted editing ComboBox control
/// and bind its ItemsSource property according to the value of the Country
/// </summary>
private void datagrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
if (e.Column.Header.Equals("City"))
{
ComboBox cboEditingElement = e.EditingElement as ComboBox;
if ((e.Row.Item as DataRowView)["Country"].Equals("China"))
{
//////////////////////////////////////////////////////////////////////////
// bind the ItemsSource property of the cmbEditingElement to China city
// string array if the selected country is China
//
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty,
new Binding() { Source = strChinaCities });
}
else
{
//////////////////////////////////////////////////////////////////////////
// bind the ItemsSource property of the cmbEditingElement to United State
// city string array if the selected country is United State
//
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty,
new Binding() { Source = strUnitedStateCities });
}
}
}
}
I'm new to WPF and I'm finding that the WPF .Net 4.0 Datagrid doesn't appear to handling cascading comboboxes. Only after focus is removed from a row do the cells populate correctly with the right data for selection boxes. I can actually see the debug points being hit after focus on the row is lost but not when focus from a cell is lost.
This type of behavior doesn't appear to be the case with the former WPF toolkit Datagrid where everything is as expected.
The obvious solution here is to go with the WPF toolkit, yet this is a new project in .Net 4.0 so doesn't make sense to go backwards (perhaps I'll reconsider with this issue). It's also my understanding that the WPF toolkit has it's own share of defects and that would require me to learn and work around as those well.
I've pretty much scoured a number of resources on the web and haven't had much luck. One reoccurring theme seems to be that the cells aren't a part of the visual tree which is creating the situation (not sure if that valid or not).
Any help on event's I may have missed or working samples are much appreciated.
Thanks in advance.
SCENARIOS
WPF .Net 4.0 Data Grid.
- Starting at row 1.
- Double click Country cell, change China to United States
- Double click City cell, notice that Cities are still for China (Not expected)
- Move focus to row 2.
- Double click the City cell for row 1 again, notice that the Cities have been updated. New York and Washington are now options.
WPF Toolkit
- Starting at row 1.
- Double click Country cell, change China to United States
- Double click City cell, notice that Cities are for the United States (expected)
The code is almost identical for the two minus the WPF Toolkit usage (Samples are from Jialiang's Blog)
CODE
WPF .Net 4.0
<Window x:Class="CSWPFCascadeDataGridComboBoxColumns.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CSWPFCascadeDataGridComboBoxColumns"
Title="Cascade DataGridComboBoxColumns" Height="300" Width="300" Loaded="Window_Loaded">
<DockPanel LastChildFill="True">
<DataGrid Name="dataGrid" ItemsSource="{Binding}"
AutoGenerateColumns="False"
PreparingCellForEdit="datagrid_PreparingCellForEdit">
<DataGrid.Columns>
<DataGridComboBoxColumn x:Name="column1" Width="80"/>
<DataGridComboBoxColumn x:Name="column2" Width="80"/>
</DataGrid.Columns>
</DataGrid>
</DockPanel>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public enum Country
{
China,
UnitedStates
}
public enum ChinaCity
{
Beijing,
Shanghai
}
public enum UnitedStatesCity
{
NewYork,
Washington
}
DataTable table = null;
string[] strChinaCities, strUnitedStateCities;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum Country
//
Array countries = Enum.GetValues(typeof(Country));
/////////////////////////////////////////////////////////////////
// copy all Country enumeration values to a string array
//
string[] strCountries = new string[countries.Length];
for (int i = 0; i < countries.Length; i++)
{
strCountries[i] = (countries as Country[])[i].ToString();
}
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum ChinaCity
//
Array chinaCities = Enum.GetValues(typeof(ChinaCity));
/////////////////////////////////////////////////////////////////
// copy all ChinaCity enumeration values to a string array
//
strChinaCities = new string[chinaCities.Length];
for (int i = 0; i < chinaCities.Length; i++)
{
strChinaCities[i] = (chinaCities as ChinaCity[])[i].ToString();
}
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum UnitedStatesCity
//
Array unitedStateCities = Enum.GetValues(typeof(UnitedStatesCity));
/////////////////////////////////////////////////////////////////
//copy all UnitedStateCity enumeration values to a string array
//
strUnitedStateCities = new string[unitedStateCities.Length];
for (int i = 0; i < unitedStateCities.Length; i++)
{
strUnitedStateCities[i] = (unitedStateCities as UnitedStatesCity[])[i].ToString();
}
//////////////////////////////////////////////////////////////////
// combine both the two city enumeration value into one string array
//
string[] strAllCities = new string[strChinaCities.Length + strUnitedStateCities.Length];
strChinaCities.CopyTo(strAllCities, 0);
strUnitedStateCities.CopyTo(strAllCities, strChinaCities.Length);
///////////////////////////////////////////////////////////////////////////////
// data bind the two DataGridComboBoxColumn's ItemsSource property respectively
//
BindingOperations.SetBinding(this.column1, DataGridComboBoxColumn.ItemsSourceProperty,
new Binding() { Source = strCountries });
BindingOperations.SetBinding(this.column2, DataGridComboBoxColumn.ItemsSourceProperty,
new Binding() { Source = strAllCities });
/////////////////////////////////////////////////////////////////
// create a DataTable and add two DataColumn into it
//
table = new DataTable();
table.Columns.Add("Country");
table.Columns.Add("City");
/////////////////////////////////////////////////////////////////
// add a DataRow into this DataTable
//
table.Rows.Add(new object[] { "China", "Beijing" });
/////////////////////////////////////////////////////////////////
// set the DataContext property of the DataGrid to the DataTable
//
this.dataGrid.DataContext = table;
/////////////////////////////////////////////////////////////////
// set the Header of both DataGridComboBoxColumn and bind the
// SelectedItemBinding property of both DataGridComboBoxColumn
this.column1.Header = "Country";
this.column1.SelectedItemBinding = new Binding("Country");
this.column2.Header = "City";
this.column2.SelectedItemBinding = new Binding("City");
}
/// <summary>
/// this PreparingCellForEdit event handler gets the hosted editing ComboBox control
/// and bind its ItemsSource property according to the value of the Country
/// </summary>
private void datagrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
if (e.Column.Header.Equals("City"))
{
ComboBox cboEditingElement = e.EditingElement as ComboBox;
if ((e.Row.Item as DataRowView)["Country"].Equals("China"))
{
//////////////////////////////////////////////////////////////////////////
// bind the ItemsSource property of the cmbEditingElement to China city
// string array if the selected country is China
//
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty,
new Binding() { Source = strChinaCities });
}
else
{
//////////////////////////////////////////////////////////////////////////
// bind the ItemsSource property of the cmbEditingElement to United State
// city string array if the selected country is United State
//
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty,
new Binding() { Source = strUnitedStateCities });
}
}
}
}
WPF Toolkit Code
MainWindow.xaml
<Window x:Class="CSWPFCascadeDataGridComboBoxColumns.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CSWPFCascadeDataGridComboBoxColumns"
xmlns:toolkit ="http://schemas.microsoft.com/wpf/2008/toolkit"
Title="Cascade DataGridComboBoxColumns" Height="300" Width="300" Loaded="Window_Loaded">
<DockPanel LastChildFill="True">
<toolkit:DataGrid Name="dataGrid" ItemsSource="{Binding}"
AutoGenerateColumns="False"
PreparingCellForEdit="datagrid_PreparingCellForEdit">
<toolkit:DataGrid.Columns>
<toolkit:DataGridComboBoxColumn x:Name="column1" Width="80"/>
<toolkit:DataGridComboBoxColumn x:Name="column2" Width="80"/>
</toolkit:DataGrid.Columns>
</toolkit:DataGrid>
</DockPanel>
MainWindow.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
public enum Country
{
China,
UnitedStates
}
public enum ChinaCity
{
Beijing,
Shanghai
}
public enum UnitedStatesCity
{
NewYork,
Washington
}
DataTable table = null;
string[] strChinaCities, strUnitedStateCities;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum Country
//
Array countries = Enum.GetValues(typeof(Country));
/////////////////////////////////////////////////////////////////
// copy all Country enumeration values to a string array
//
string[] strCountries = new string[countries.Length];
for (int i = 0; i < countries.Length; i++)
{
strCountries[i] = (countries as Country[])[i].ToString();
}
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum ChinaCity
//
Array chinaCities = Enum.GetValues(typeof(ChinaCity));
/////////////////////////////////////////////////////////////////
// copy all ChinaCity enumeration values to a string array
//
strChinaCities = new string[chinaCities.Length];
for (int i = 0; i < chinaCities.Length; i++)
{
strChinaCities[i] = (chinaCities as ChinaCity[])[i].ToString();
}
/////////////////////////////////////////////////////////////////
// get all enumeration values of type enum UnitedStatesCity
//
Array unitedStateCities = Enum.GetValues(typeof(UnitedStatesCity));
/////////////////////////////////////////////////////////////////
//copy all UnitedStateCity enumeration values to a string array
//
strUnitedStateCities = new string[unitedStateCities.Length];
for (int i = 0; i < unitedStateCities.Length; i++)
{
strUnitedStateCities[i] = (unitedStateCities as UnitedStatesCity[])[i].ToString();
}
//////////////////////////////////////////////////////////////////
// combine both the two city enumeration value into one string array
//
string[] strAllCities = new string[strChinaCities.Length + strUnitedStateCities.Length];
strChinaCities.CopyTo(strAllCities, 0);
strUnitedStateCities.CopyTo(strAllCities, strChinaCities.Length);
///////////////////////////////////////////////////////////////////////////////
// data bind the two DataGridComboBoxColumn's ItemsSource property respectively
//
BindingOperations.SetBinding(this.column1, DataGridComboBoxColumn.ItemsSourceProperty,
new Binding() { Source = strCountries });
BindingOperations.SetBinding(this.column2, DataGridComboBoxColumn.ItemsSourceProperty,
new Binding() { Source = strAllCities });
/////////////////////////////////////////////////////////////////
// create a DataTable and add two DataColumn into it
//
table = new DataTable();
table.Columns.Add("Country");
table.Columns.Add("City");
/////////////////////////////////////////////////////////////////
// add a DataRow into this DataTable
//
table.Rows.Add(new object[] { "China", "Beijing" });
/////////////////////////////////////////////////////////////////
// set the DataContext property of the DataGrid to the DataTable
//
this.dataGrid.DataContext = table;
/////////////////////////////////////////////////////////////////
// set the Header of both DataGridComboBoxColumn and bind the
// SelectedItemBinding property of both DataGridComboBoxColumn
this.column1.Header = "Country";
this.column1.SelectedItemBinding = new Binding("Country");
this.column2.Header = "City";
this.column2.SelectedItemBinding = new Binding("City");
}
/// <summary>
/// this PreparingCellForEdit event handler gets the hosted editing ComboBox control
/// and bind its ItemsSource property according to the value of the Country
/// </summary>
private void datagrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
if (e.Column.Header.Equals("City"))
{
ComboBox cboEditingElement = e.EditingElement as ComboBox;
if ((e.Row.Item as DataRowView)["Country"].Equals("China"))
{
//////////////////////////////////////////////////////////////////////////
// bind the ItemsSource property of the cmbEditingElement to China city
// string array if the selected country is China
//
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty,
new Binding() { Source = strChinaCities });
}
else
{
//////////////////////////////////////////////////////////////////////////
// bind the ItemsSource property of the cmbEditingElement to United State
// city string array if the selected country is United State
//
BindingOperations.SetBinding(cboEditingElement, ComboBox.ItemsSourceProperty,
new Binding() { Source = strUnitedStateCities });
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我总是感到惊讶,一个人花这么多时间研究一个问题,只是向社区提出问题,然后在 60 分钟内找到答案。因此,对于 WPF 新手来说肯定会遇到一些困难。
显然,这就像在所选项目的绑定上设置
UpdateSourceTrigger=PropertyChanged
一样简单。来自微软:
希望除我之外的其他人会发现这很有用。
It always amazes me how one can spend so much time researching an issue only to ask the question to the community and then find an answer within 60 minutes. So being new to WPF certainly has its fair share of lumps to take.
Apparently it's as simple as setting the
UpdateSourceTrigger=PropertyChanged
on the binding of the selected item.From Microsoft:
Hopefully someone other than myself will find this useful.