【问题标题】:WPF DataGrid combobox change selection issueWPF DataGrid 组合框更改选择问题
【发布时间】:2018-06-24 12:59:16
【问题描述】:

我有一个 DataGrid,其中有一列有一个 ComboBox:

    DataGridTemplateColumn colDataType = new DataGridTemplateColumn();
    colDataType.Header = "Type";
    var cboFactoryDT = new FrameworkElementFactory(typeof(ComboBox));
    cboFactoryDT.SetValue(ComboBox.ItemsSourceProperty, Enum.GetValues(typeof(BuilderDataTypes)).Cast<BuilderDataTypes>());
    b = new Binding("Value[1]");
    b.Converter = new ObjectToDataTypeConverter();
    b.UpdateSourceTrigger = UpdateSourceTrigger.LostFocus;
    b.Mode = BindingMode.TwoWay;
    cboFactoryDT.SetBinding(ComboBox.SelectedIndexProperty, b);
    cboFactoryDT.SetValue(ComboBox.IsSynchronizedWithCurrentItemProperty, true);
    DataTemplate dtDT = new DataTemplate { VisualTree = cboFactoryDT };
    colDataType.CellTemplate = dtDT;

我的转换器类是:

public class ObjectToDataTypeConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        try
        {
            return int.Parse(value.ToString());
        }
        catch { return 0; }
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        try
        {
            return value;
        }
        catch { return 0; }
    }
}

现在,问题是当我更改其中一行中的选择时,所有行中的所有组合框也都更改为相同的选择。

可能是什么问题?

【问题讨论】:

    标签: c# wpf data-binding combobox datagrid


    【解决方案1】:

    看到像你这样的异常处理是我的烦恼。你的代码有能力吞下致命异常,这是异常处理的致命罪过。您应该阅读这些关于正确异常处理的文章:

    http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET

    更让我惊讶的是,你对 Parse 做了错误的处理。如果您不想要恼人的异常,可以使用 TryParse。不使用它的唯一原因是,如果您以某种方式低于引入它的框架版本 2.0。我有针对这种情况的替换代码,但使用 WPF 似乎不太可能。

    【讨论】:

    • 我知道绑定到我的组合框列的变量可能为空,所以在这种情况下它会引发一个异常,该异常将返回 0 以使组合框选择第一项
    • 在这种情况下,任何解析异常和任何other异常都会被吞没并返回0。TryParse显式处理null情况。从 C# 6.0 左右开始,有一种简短的语法可以检查空情况。你糟糕的理由只会让错误变得更糟。
    • 好的,很抱歉。我会修复它。谢谢你的建议。但是你有解决主要问题的办法吗?
    • 很难说。如果你吞下 excptions,你会得到各种不可理解的后续行为。你可能在其他代码中也有类似的错误。老实说,一开始就在代码后面生成列真的很令人困惑。这就是行和类型定位数据模板的用途。 WPF/UWP 在设计时考虑到了 MVVM 模式,它看起来一点也不像 MVVM 模式。几年前我写了一个简短的介绍,也许它可以帮助你:social.msdn.microsoft.com/Forums/vstudio/en-US/…
    猜你喜欢
    • 2018-04-03
    • 1970-01-01
    • 2012-02-03
    • 2012-11-30
    • 2010-12-04
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多