【问题标题】:Unable to bind data to an autocomplete box in a silverlight 4 datagrid无法将数据绑定到 silverlight 4 数据网格中的自动完成框
【发布时间】:2023-03-13 04:58:01
【问题描述】:

我是 silverlight 新手,我的任务是将数据网格 TextColumns 更改为自动完成框。我认为这应该相当简单,但显然不是。

我可以从数据网格外部的列表中绑定数据,但不能从内部绑定。

我已经研究了两天,我发现的所有内容似乎都包含数据库中的数据,或者对于我的新手大脑来说太复杂了。

我真正需要的只是一个简单的示例和说明如何在数据网格中执行此操作而不是常规操作。

我的代码如下。它构建成功,但无法正常工作。

我相信这是许多其他人一定遇到过的问题。

感谢任何人的意见, 提前致谢。 d.

    <UserControl xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"  xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  
         xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"  x:Class="AccordionAutoCompleteBox.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="680" d:DesignWidth="1240">
    <Grid x:Name="LayoutRoot" Background="White">
        <StackPanel VerticalAlignment="Center">
        <toolkit:AccordionItem x:Name="AccordionItem2" FontSize="12" Background="LightBlue" BorderBrush="Wheat" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsSelected="False" MaxHeight="400">
            <sdk:DataGrid Name="AccordionGrid"  ItemsSource="{Binding ExpData}" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HeadersVisibility="All" BorderThickness="1" Margin="8" SelectionMode="Single" Canvas.ZIndex="-1" MaxHeight="360">
                <sdk:DataGrid.Columns>
                    <sdk:DataGridTemplateColumn Header="Exp">
                        <sdk:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <sdk:AutoCompleteBox x:Name="AutoCompGrid" Text="{Binding Exp, Mode=TwoWay}" ItemsSource="{Binding Exp}"  IsTextCompletionEnabled="True" />

                            </DataTemplate>
                        </sdk:DataGridTemplateColumn.CellTemplate>
                    </sdk:DataGridTemplateColumn>
                    <sdk:DataGridTextColumn Header="Exp" Binding="{Binding Exp}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Desc" Binding="{Binding Desc}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Prod" Binding="{Binding Prod}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Source" Binding="{Binding Source}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Start" Binding="{Binding Start}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Reset" Binding="{Binding Reset}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Amt" Binding="{Binding Amt}" IsReadOnly="False" />

                </sdk:DataGrid.Columns>
            </sdk:DataGrid>
        </toolkit:AccordionItem>
        <sdk:AutoCompleteBox x:Name="AutoCompGrid2" Text="{Binding Exp}" ItemsSource="{Binding Exp}" IsTextCompletionEnabled="False" />
    </StackPanel>
</Grid>

以及背后的代码

    namespace AccordionAutoCompleteBox

{ 公共部分类 MainPage : UserControl { 公共主页() { 初始化组件();

        List<ExpData> myList = new List<ExpData>
        {
            new ExpData
            {Exp = "cell 1",
            Desc = "cell 2",
            Prod = "cell 3",
            Source = "cell 4",
            Start = "cell 5",
            Amt = "cell 6",
            Reset = "cell 7"},

            new ExpData
            {Exp = "cell 8",
            Desc = "cell 9",
            Prod = "cell 10",
            Source = "cell 11",
            Start = "cell 12",
            Amt = "cell 13",
            Reset = "cell 14"}
        };
        AccordionGrid.ItemsSource = myList;
        AutoCompGrid2.ItemsSource = myList;

        this.AccordionItem2.Header = " Accordion Header ";

    }
}
public class ExpData
{
    public String Exp { get; set; }
    public String Desc { get; set; }
    public String Prod { get; set; }
    public String Source { get; set; }
    public String Start { get; set; }
    public String Reset { get; set; }
    public String Amt { get; set; }

    public ExpData(String exp, string desc, string prod, string source, string start, String reset, String amt)
    {
        Exp = exp;
        Desc = desc;
        Prod = prod;
        Source = source;
        Start = start;
        Reset = reset;
        Amt = amt;
    }

    public override string ToString()
    {
        return Exp;
    }

【问题讨论】:

  • 您将自动完成框的 itemssource 绑定到与文本相同的属性。您是否尝试获取所有 Exp 值的列表并让用户从中进行选择?
  • 是的,布莱恩特,这正是我m trying to do. Ive 尝试了很多方法,我似乎只能像上面那样建立联系。我在过去两天所做的所有研究都给了我一些答案,但到目前为止没有任何效果。

标签: silverlight


【解决方案1】:

如果你有一个视图模型,你的生活会轻松很多。 :) 使用 ViewModel 解决此问题的快速示例。

public class ExpDataViewModel
{
  private List<ExpData> _listData;

  public ExpDataViewModel()
  {
    _listData = new List<ExpData>
        {
            new ExpData
            {Exp = "cell 1",
            Desc = "cell 2",
            Prod = "cell 3",
            Source = "cell 4",
            Start = "cell 5",
            Amt = "cell 6",
            Reset = "cell 7"},

            new ExpData
            {Exp = "cell 8",
            Desc = "cell 9",
            Prod = "cell 10",
            Source = "cell 11",
            Start = "cell 12",
            Amt = "cell 13",
            Reset = "cell 14"}
        };
  }

  public IEnumerable<ExpData> ListData
  {
    get {return _listData;}
  }     

  public IEnumerable<string> ExpItems
  {
    get {return _listData.Select(i => i.Exp);
  }
}

那么你需要改变你的看法:

<UserControl xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"  xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"  
         xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit"  x:Class="AccordionAutoCompleteBox.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="[Your ViewModel's Namespace]"
mc:Ignorable="d"
d:DesignHeight="680" d:DesignWidth="1240">
<UserControl.Resources>
  <vm:ExpDataViewModel x:Key="vm" />
</UserControl.Resource>

    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource vm}">
        <StackPanel VerticalAlignment="Center">
        <toolkit:AccordionItem x:Name="AccordionItem2" FontSize="12" Background="LightBlue" BorderBrush="Wheat" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" IsSelected="False" MaxHeight="400">
            <sdk:DataGrid Name="AccordionGrid"  ItemsSource="{Binding ListData}" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" HeadersVisibility="All" BorderThickness="1" Margin="8" SelectionMode="Single" Canvas.ZIndex="-1" MaxHeight="360">
                <sdk:DataGrid.Columns>
                    <sdk:DataGridTemplateColumn Header="Exp">
                        <sdk:DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <sdk:AutoCompleteBox x:Name="AutoCompGrid" Text="{Binding Exp, Mode=TwoWay}" ItemsSource="{Binding Path=ExpItems, Source={StaticResource vm}}"  IsTextCompletionEnabled="True" />

                            </DataTemplate>
                        </sdk:DataGridTemplateColumn.CellTemplate>
                    </sdk:DataGridTemplateColumn>
                    <sdk:DataGridTextColumn Header="Exp" Binding="{Binding Exp}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Desc" Binding="{Binding Desc}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Prod" Binding="{Binding Prod}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Source" Binding="{Binding Source}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Start" Binding="{Binding Start}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Reset" Binding="{Binding Reset}" IsReadOnly="False" />
                    <sdk:DataGridTextColumn Header="Amt" Binding="{Binding Amt}" IsReadOnly="False" />

                </sdk:DataGrid.Columns>
            </sdk:DataGrid>
        </toolkit:AccordionItem>
        <!-- not sure what this is supposed to be bound to --> 
        <sdk:AutoCompleteBox x:Name="AutoCompGrid2" Text="{Binding Exp}" ItemsSource="{Binding Exp}" IsTextCompletionEnabled="False" />
    </StackPanel>
</Grid>

您可以从代码隐藏文件中删除所有自定义代码。

【讨论】:

  • 布莱恩特,非常感谢你为我提供这个。我已经尝试过了,它解决了我的问题。但是,我确实有一个小问题,因为下拉选择不可见,但这可能只是某处的属性更改。明天我将花一些时间来回顾这个视图模型类。就像我说的那样,我对整个事情都是新手,所以在我理解这一切是如何运作之前,我需要消化很多逻辑。再次感谢!
  • 不客气! (顺便说一句 - 如果它确实回答了您的问题,您应该将其标记为已回答)
猜你喜欢
  • 2012-05-15
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多