在数据网格内部操作时,我一直在努力保存我的组合框选择值.当我制作一个没有数据网格的测试解决方案时,一切正常.上下文是与相关国家/地区的人名.这些国家/地区存储在xml文件中.以下是初始视图的快照:

你在这里看到PersonList.xaml的(重要部分):
<UserControl.Resources>
<XmlDataProvider x:Key="Dataxml" Source="\Properties\AllCountries.xml" />
<model:Person x:Key="Person"/>
</UserControl.Resources>
<UserControl.DataContext>
<viewModel:PersonListViewModel />
</UserControl.DataContext>
<DataGrid ItemsSource="{Binding Persons}" AutoGenerateColumns="False" IsReadOnly="False" CanUserAddRows="False" SelectionUnit="FullRow" SelectedItem="{Binding SelectedPerson}" >
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" CanUserSort="true" ></DataGridTextColumn>
<DataGridTemplateColumn Header="Country">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox
Width="150"
SelectedValuePath="country"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Source={StaticResource Dataxml}, XPath=/countries/country}"
SelectedIndex="{Binding CountryIndex}"
SelectedItem="{Binding Path=XmlCountry, Mode=TwoWay}">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}, {1}">
<Binding XPath="name" />
<Binding XPath="iso" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
此网格由PersonListViewModel填充,PersonListViewModel具有ObservableCollection<Person> _persons实现INotifyPropertyChanged 的私有属性,并且是网格的ItemsSource.你也看到SelectedItem="{Binding SelectedPerson}"了网格中的内容.那部分工作正常. …
我正在开发一个 .NET 4.5 小型 WPF/MVVM 项目,并且我正在尝试让进度条与 async/await 一起正确工作。
我已经一切正常,但无法正确取消任务。或者,我认为任务可能被取消,但进度条无论如何都会运行完整长度。
我在“开始”和“停止”上调用“LongRun”方法,但当我想停止时使用可选的取消令牌参数。这可能是一种不寻常的做事方式,但我认为它看起来不错 - 至少在理论上:-)
这是一些代码:
视图模型
public MainViewModel()
{
_progress = new Progress<int>(ReportProgress);
CountFilesCreatedCommand = new RelayCommand<IProgress<int>>(progress => LongRun(Progress));
_tokenSource = new CancellationTokenSource();
_tokenSource.Cancel();
StopCountFilesCommand = new RelayCommand<CancellationToken>(token => LongRun(Progress, _tokenSource.Token));
ProgressText = "...";
}
private void ReportProgress(int result)
{
PercentProgress = result;
}
private async void LongRun(IProgress<int> progress, CancellationToken token = default(CancellationToken))
{
try
{
// Start long running task here
int i = 0;
for (; i != 101; ++i) …Run Code Online (Sandbox Code Playgroud)