为TextBox或代码解决方法寻找DisplayMemberPath的替代方案

时间:2013-03-07 16:54:13

标签: c# wpf mvvm textbox custom-controls

查看TextBox所来自的继承层次结构,我发现TextBox没有DisplayMemberPath属性。这是有道理的,因为它没有ItemsSource绑定的项目,因此没有DisplayMemberPath。但是,对于DisplayMemberPath或者可编辑的内容,我需要TextBox之类的内容,我正在根据以下情况寻找选项。

我正在使用的类/视图/ ViewModels:

Test.cs - 代码优先实体

public class Test : BaseModel
{
    public int Id { get; set; }
    public int GasProfileId { get; set; }
}

GasProfile.cs - 代码优先实体

public class GasProfile : BaseModel
{

    public int Id { get; set; }
    public double H2O { get; set; }
    public double CO2 { get; set; }

    private ObservableCollection<Test> _tests;
    public virtual ObservableCollection<Test> Tests
    {
        get { return _tests; }
        set
        {

            if (_tests != value)
            {
                _tests = value;
                Notify("Tests");
            }
        }
    }
}

TestGasView.xaml - 查看(USerControl)

这就是TestGasView.xaml 现在的样子

<Grid>
    <ListBox ItemsSource="{Binding SelectedTechnician.Test}"
             DisplayMemberPath="TestName">
             selectedItem="SelectedTest"
    </ListBox>

    <Label Content="H20"/>
    <TextBox></TextBox>
    <Label Content="CO2"/>
    <TextBox></TextBox>
</Grid>

这是我想要的东西它看起来像/表现得像(警告:破码/伪代码):

<Grid>
    <ListBox ItemsSource="{Binding SelectedTechnician.Test}"
             DisplayMemberPath="TestName"
             SelectedItem="SelectedTest">
    </ListBox>

    <Label Content="H20"/>
    <TextBox Text="{Binding SelectedTest.GasProfile}"
             DiaplayMemberPath="H20"></TextBox>
    <Label Content="CO2"/>
    <TextBox Text="{Binding SelectedTest.GasProfile}"
             DiaplayMemberPath="CO2"></TextBox>
</Grid>

TestGasViewModel.cs - ViewModel

有一个属性来获取/设置SelectedTest。

正如您所看到的,TextBox es上我想要的数据绑定是错误的,DisplayMemberPath的位置也是错误的,但这表明我非常希望显示的值是1)可编辑2)通过点击测试并绑定到GasProfile上的“气体属性”来显示,SelectedTest有一个键。

所以我的问题是,“TextBox上是否有一些属性让我将Text属性绑定到GasProfile并获取我想要显示的气体的值?”如果没有,也许有一些方法来创建一个代理类,可以启用这样的绑定:

<Grid>
    <ListBox ItemsSource="{Binding SelectedTechnician.Test}"
             DisplayMemberPath="TestName"
             SelectedItem="SelectedTest">
    </ListBox>

    <Label Content="H20"/>
    <TextBox Text="{Binding SelectedTestGasProfile.H20}"></TextBox>
    <Label Content="CO2"/>
    <TextBox Text="{Binding SelectedTestGasProfile.CO2}"></TextBox>
</Grid>

如果它不是“哦,将此属性用于TextBox”,那么我正在寻找代码建议来实现上述目标。

由于

修改

这是一个截图,显示我确实有一个选定的测试和FieldGasProfileID(我的意思是GasProfile)确实有一个值:

Selected Test

1 个答案:

答案 0 :(得分:2)

<TextBox Text="{Binding SelectedTest.GasProfile.H20}"</TextBox>
<Label Content="CO2"/>
<TextBox Text="{Binding SelectedTest.GasProfile.CO2}"</TextBox>

我希望这会有所帮助。