WPF ComboBox 转换问题

blwuer 2013-09-06 03:11:56
在UI中有两个ComboBox:cmbMultiple, cmbValueList;

cmbMultiple,选项固定为:1,2,3,4;

cmbValueList,的选项在初始化时获取并绑定的ItemSources;

我要实现的效果为,cmbValueList显示的数据为根据cmbMultiple的选择进行的动态转换。

比如:cmbValueList绑定的值为:4,3,2,1,

当cmbMultiple选择1时,cmbValueList呈现:4,3,2,1,

当cmbMultiple选择2时,cmbValueList呈现:8,6,4,2,(也就是值乘2)

当cmbMultiple选择3时,cmbValueList呈现:12,9,6,3,(也就是值乘3)。。。。。。

如果是在DataGrid中进行绑定转换实现Converter类就可以了,可是在ComboBox中我就懵了,不知道该转换那个了?
...全文
552 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
blwuer 2013-09-16
  • 打赏
  • 举报
回复
看来这个帖子只能草草了结了
blwuer 2013-09-11
  • 打赏
  • 举报
回复
引用 15 楼 KumaPower 的回复:
[quote=引用 14 楼 blwuer 的回复:] 是独立的两个列表项,是实际运行时根据条件从数据库中获取的。 数据的独立的,但是为了呈现数据时更人性化,因此想根据cmbMultiple的选择项重新计算cmbValueList所呈现的数据。 实现的效果和你上面给出的代码实现的效果是看上去一样的。但是如果按照你那样做我将在Convert中重新获取cmbValueList的数据,因此我说还不如放到SelectionChanged中处理
照你这样说,这里应该用触发器会更好。[/quote]
引用 15 楼 KumaPower 的回复:
[quote=引用 14 楼 blwuer 的回复:] 是独立的两个列表项,是实际运行时根据条件从数据库中获取的。 数据的独立的,但是为了呈现数据时更人性化,因此想根据cmbMultiple的选择项重新计算cmbValueList所呈现的数据。 实现的效果和你上面给出的代码实现的效果是看上去一样的。但是如果按照你那样做我将在Convert中重新获取cmbValueList的数据,因此我说还不如放到SelectionChanged中处理
照你这样说,这里应该用触发器会更好。[/quote] 求指教
Bonjour-你好 2013-09-10
  • 打赏
  • 举报
回复


这效果?
Bonjour-你好 2013-09-10
  • 打赏
  • 举报
回复
引用 7 楼 blwuer 的回复:
把你的示例代码贴出来参详参详
详细代码在家里的电脑中,要不等下中午休息我再写一次。 说下思路,其实你不应该把 cmbValueList 的 ItemSource 绑定 cmbMultiple 的 ItemSource ,你应该绑定 cmbMultiple 的 Text 属性(即成功选择后的值),这样写绑定的转换器就简单了。 还有,我的代码是以你{4,3,2,1}和{1,2,3,4}这数据为依据,所以如果是用在实际情况中,就需要变通更改。
blwuer 2013-09-10
  • 打赏
  • 举报
回复
引用 5 楼 KumaPower 的回复:
这效果?
把你的示例代码贴出来参详参详
blwuer 2013-09-10
  • 打赏
  • 举报
回复
引用 4 楼 lizhi3186575 的回复:
[quote=引用 2 楼 blwuer 的回复:] [quote=引用 1 楼 lizhi3186575 的回复:] 你可以指定Combobox 的ItemSource属性绑定cmbValueList作为数据源,然后再用指定Convert来进行转换,设置传入的参数为第一个Combobox选中的值就可以了
问题是那个属性设置Convert?[/quote] 就是ItemSource设置Convert 大概是这样的:

<Combobox ItemSource={Binding List,Convert={StaticSource ListConvert},ConvertParameter={Binding List}}>
[/quote] 这里的List是什么?
Bonjour-你好 2013-09-10
  • 打赏
  • 举报
回复
引用 14 楼 blwuer 的回复:
是独立的两个列表项,是实际运行时根据条件从数据库中获取的。 数据的独立的,但是为了呈现数据时更人性化,因此想根据cmbMultiple的选择项重新计算cmbValueList所呈现的数据。 实现的效果和你上面给出的代码实现的效果是看上去一样的。但是如果按照你那样做我将在Convert中重新获取cmbValueList的数据,因此我说还不如放到SelectionChanged中处理
照你这样说,这里应该用触发器会更好。
blwuer 2013-09-10
  • 打赏
  • 举报
回复
引用 13 楼 KumaPower 的回复:
[quote=引用 12 楼 blwuer 的回复:] 这样做还不如放到cmbMultiple的SelectionChanged事件处理程序中重新对cmbValueList赋值
因为你自己给出的数据太“死”了,我不知你的需求。你这里的cmbMultiple, cmbValueList是独立还是关联的?[/quote] 是独立的两个列表项,是实际运行时根据条件从数据库中获取的。 数据的独立的,但是为了呈现数据时更人性化,因此想根据cmbMultiple的选择项重新计算cmbValueList所呈现的数据。 实现的效果和你上面给出的代码实现的效果是看上去一样的。但是如果按照你那样做我将在Convert中重新获取cmbValueList的数据,因此我说还不如放到SelectionChanged中处理
Bonjour-你好 2013-09-10
  • 打赏
  • 举报
回复
引用 12 楼 blwuer 的回复:
这样做还不如放到cmbMultiple的SelectionChanged事件处理程序中重新对cmbValueList赋值
因为你自己给出的数据太“死”了,我不知你的需求。你这里的cmbMultiple, cmbValueList是独立还是关联的?
blwuer 2013-09-10
  • 打赏
  • 举报
回复
这样做还不如放到cmbMultiple的SelectionChanged事件处理程序中重新对cmbValueList赋值
blwuer 2013-09-10
  • 打赏
  • 举报
回复
引用 10 楼 KumaPower 的回复:

            if (Int32.TryParse(str, out v)) {
                List<Int32> result = new List<int> { 4, 3, 2, 1 };
                for (Int32 i = 0; i < result.Count; i++) {
                    result[i] = result[i] * v;
                }
                return result;
            }

}
按你这个做法,我只能将{ 4, 3, 2, 1 }这个列表的数据放到Convert中?
Bonjour-你好 2013-09-10
  • 打赏
  • 举报
回复
<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfTest"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <local:MyConverter x:Key="myC"/>
    </Window.Resources>

    <Grid>

        <ComboBox HorizontalAlignment="Left" Margin="50,43,0,0" VerticalAlignment="Top" Width="120" x:Name="cmbMultiple"/>

        <ComboBox HorizontalAlignment="Left" Margin="50,172,0,0" VerticalAlignment="Top" Width="120" x:Name="cmbValueList" ItemsSource="{Binding Text, Converter={StaticResource myC}, ElementName=cmbMultiple}"  />

    </Grid>
</Window>
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;

namespace WpfTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            cmbMultiple.ItemsSource = new List<Int32> { 1, 2, 3, 4 };
        }
    }

    [ValueConversion(typeof(String), typeof(List<Int32>))]
    public class MyConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            String str = value.ToString();
            Int32 v = 0;
            if (Int32.TryParse(str, out v)) {
                List<Int32> result = new List<int> { 4, 3, 2, 1 };
                for (Int32 i = 0; i < result.Count; i++) {
                    result[i] = result[i] * v;
                }
                return result;
            }

            return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
blwuer 2013-09-10
  • 打赏
  • 举报
回复
引用 8 楼 KumaPower 的回复:
[quote=引用 7 楼 blwuer 的回复:] 把你的示例代码贴出来参详参详
详细代码在家里的电脑中,要不等下中午休息我再写一次。 说下思路,其实你不应该把 cmbValueList 的 ItemSource 绑定 cmbMultiple 的 ItemSource ,你应该绑定 cmbMultiple 的 Text 属性(即成功选择后的值),这样写绑定的转换器就简单了。 还有,我的代码是以你{4,3,2,1}和{1,2,3,4}这数据为依据,所以如果是用在实际情况中,就需要变通更改。[/quote] 还是麻烦你晚上把代码贴上来看看更明了,我现在已经在云中了,晕乎乎的
人生导师 2013-09-06
  • 打赏
  • 举报
回复
引用 2 楼 blwuer 的回复:
[quote=引用 1 楼 lizhi3186575 的回复:] 你可以指定Combobox 的ItemSource属性绑定cmbValueList作为数据源,然后再用指定Convert来进行转换,设置传入的参数为第一个Combobox选中的值就可以了
问题是那个属性设置Convert?[/quote] 就是ItemSource设置Convert 大概是这样的:

<Combobox ItemSource={Binding List,Convert={StaticSource ListConvert},ConvertParameter={Binding List}}>
灬浪子灬 2013-09-06
  • 打赏
  • 举报
回复
blwuer 2013-09-06
  • 打赏
  • 举报
回复
引用 1 楼 lizhi3186575 的回复:
你可以指定Combobox 的ItemSource属性绑定cmbValueList作为数据源,然后再用指定Convert来进行转换,设置传入的参数为第一个Combobox选中的值就可以了
问题是那个属性设置Convert?
人生导师 2013-09-06
  • 打赏
  • 举报
回复
你可以指定Combobox 的ItemSource属性绑定cmbValueList作为数据源,然后再用指定Convert来进行转换,设置传入的参数为第一个Combobox选中的值就可以了

8,756

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧