gpt4 book ai didi

c# - 未调用 WPF IValueConverter.ConvertBack

转载 作者:行者123 更新时间:2023-12-03 10:37:21 26 4
gpt4 key购买 nike

我在下面有一些代码,这是我正在尝试做的简化示例。我正在使用转换器尝试用我拥有的模型中的数据填充 DataGrid。 DataGrid 已正确填充,但网格中的任何更改都不会保留回对象。我已将模式指定为 TwoWay。当我在转换器的 ConvertBack 方法上放置断点时,它永远不会被调用。

我对 WPF 和 MVVM 相当陌生,所以我看不出我做错了什么。我无法改变模型,所以我想看看这是否可行,除非有明显更好的方法。

XAML:

<Window x:Class="SampleBindingProblem.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SampleBindingProblem"
Title="MainWindow" Height="400" Width="500">
<Window.Resources>
<ResourceDictionary>
<local:ScenarioDataTableConverter x:Key="ScenarioDataTableConverter" />
</ResourceDictionary>
</Window.Resources>
<Grid>
<ListBox ItemsSource="{Binding Scenarios}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<DataGrid Margin="5" ItemsSource="{Binding Path=Options, Mode=TwoWay, Converter={StaticResource ScenarioDataTableConverter}}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ListBox>
</Grid>
</Window>

应用程序.xaml.cs:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace SampleBindingProblem
{
public class ColumnInfo
{
public static readonly String[] ColumnLabels = new String[] { "Variable1", "Variable2", "Variable3", "Variable4", "Variable5" };
}

public class ScenarioOption
{
public String Label { get; set; }
public String[] Variables { get; set; }
}

public class Scenario
{
public ScenarioOption[] Options { get; set; }
}

internal class ScenarioDataTableConverter : IValueConverter
{
public Object Convert (Object value, Type targetType, Object parameter, CultureInfo culture)
{
if (value == null)
return (null);

ScenarioOption[] options = (ScenarioOption[]) value;

DataTable table = new DataTable();

table.Columns.Add("Label", typeof(String));
for (Int32 c = 0; c < ColumnInfo.ColumnLabels.Length; ++c)
table.Columns.Add(ColumnInfo.ColumnLabels[c], typeof(String));
foreach (ScenarioOption option in options)
{
DataRow row = table.NewRow();
List<String> lst = new List<String>();
lst.Add(option.Label);
lst.AddRange(option.Variables);
row.ItemArray = lst.ToArray();
table.Rows.Add(row);
}

return (table.DefaultView);
}

public Object ConvertBack (Object value, Type targetType, Object parameter, CultureInfo culture)
{
return (null);
}
}

internal class ViewModel : INotifyPropertyChanged
{
public void RaisePropertyChanged (String property)
{
if (this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(property));
}

public event PropertyChangedEventHandler PropertyChanged = null;

public ObservableCollection<Scenario> Scenarios { get; set; }

public ViewModel ()
{
Scenario s1 = new Scenario();
s1.Options = new ScenarioOption[] {
new ScenarioOption() { Label = "Opt1", Variables=new String[] { "1", "2", "3", "4", "5" } },
new ScenarioOption() { Label = "Opt2", Variables=new String[] { "2", "3", "4", "5", "6" } },
new ScenarioOption() { Label = "Opt3", Variables=new String[] { "3", "4", "5", "6", "7" } },
};
Scenario s2 = new Scenario();
s2.Options = new ScenarioOption[] {
new ScenarioOption() { Label = "Opt1", Variables=new String[] { "1", "2", "3", "4", "5" } },
new ScenarioOption() { Label = "Opt2", Variables=new String[] { "2", "3", "4", "5", "6" } },
new ScenarioOption() { Label = "Opt3", Variables=new String[] { "3", "4", "5", "6", "7" } },
};

this.Scenarios = new ObservableCollection<Scenario>();
this.Scenarios.Add(s1);
this.Scenarios.Add(s2);
}
}

/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
private void Application_Startup (Object sender, StartupEventArgs e)
{
MainWindow window = new MainWindow();
window.DataContext = new ViewModel();
window.ShowDialog();
}
}
}

最佳答案

当涉及到集合时,转换器不会以这种方式工作。 ConvertBack只有在整个集合被替换时才会调用。修改集合中的项目时不会调用它。在您的情况下,集合(DataView)没有被新的 DataView 实例替换,而是被修改,这就是 ConvertBack 的原因没有被调用。

如果你问我,我不明白你为什么需要使用转换器。直接绑定(bind)到 Scenarios属性并处理 View 模型公开的此集合,或者调用 View 模型中的转换代码并公开生成的 DataView在不同的属性。然后您只需要绑定(bind)到该属性而不指定转换器。

关于c# - 未调用 WPF IValueConverter.ConvertBack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20959587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com