繁体   English   中英

Listview DataTemplate绑定返回错误

[英]Listview DataTemplate Binding returning an error

我正在尝试从Winform切换到WPF,到目前为止,这很痛苦。

无论如何,我正在尝试使这种绑定的东西能够使用DataTemplate正常工作。

我有一堂课:

public class TranslatorListItem
{
    public string Item { get; set; }
    public string OriginalMessage { get; set; }
    public string TranslatedMessage { get; set; }
    public string Sector { get; set; }
}

像这样添加项目:

TranslatorListItem TLI = new TranslatorListItem();
TranslatorLVI.Items.Add(TLI);

我的XAML DataTemplate:

<DataTemplate x:Key="MyDataTemplate">
    <Border BorderBrush="#FFA4D5E5" BorderThickness="1,1,0,0" Margin="6">
        <StackPanel Margin="6,2,6,2">
            <TextBox Text="{Binding}" TextWrapping="Wrap" BorderThickness="0" BorderBrush="#00000000" />
        </StackPanel>
    </Border>
</DataTemplate>

这就是我试图绑定数据的方式,但是它返回此错误:“双向绑定需要Path或XPath。”

    <ListView Margin="23,224,27,54" Name="TranslatorLVI" ItemsSource="{Binding}" HorizontalContentAlignment="Stretch" 
              ItemContainerStyle="{StaticResource MyItemContainerStyle}">
        <ListView.View>
            <GridView AllowsColumnReorder="False">
                <GridViewColumn Header="Item" DisplayMemberBinding="{Binding Path=Item}" CellTemplate="{StaticResource MyDataTemplate}" />
                <GridViewColumn Header="Original Message" Width="300" CellTemplate="{StaticResource MyDataTemplate}" />
                <GridViewColumn Header="Translated Message" DisplayMemberBinding="{Binding Path=TranslatedMessage}" CellTemplate="{StaticResource MyDataTemplate}" />
                <GridViewColumn Header="Sector" DisplayMemberBinding="{Binding Path=Sector}" />
            </GridView>
        </ListView.View>
    </ListView>

我需要TranslatedMessage绑定是可编辑的。 因此该字段不会是只读的。 我听说可能需要设置双向绑定,但是我不确定该怎么做。

任何帮助表示赞赏。 谢谢!

我正在尝试从Winform切换到WPF,到目前为止,这很痛苦。

不,这不对。 WPF是人类历史上最好的UI框架。 Winforms(或其他任何形式)甚至无法与其进行比较。

您的问题是您尝试在WPF中使用Winforms方法,但失败了。 WPF不以Winforms的心态支持开发人员。

WPF完全不需要您习惯从winforms进行黑客攻击的所有可怕代码。

请阅读Rachel的出色解答 (以及链接的博客文章),了解从Winforms升级到WPF时所需的思维转变。


如@JasRaj的答案中所述,在这种情况下,您缺少DisplayMemberBinding 我测试了您的代码并添加了该代码,如下所示:

<GridViewColumn Header="Original Message" 
                DisplayMemberBinding="{Binding OriginalMessage}"  
                Width="300"/>

而且效果很好。


在仔细阅读了您的问题之后,我意识到您想使这些列之一可编辑。

首先,我要说的是,虽然可以使用ListView实现所需的功能,但使用DataGrid 容易

您需要从ListView移除DisplayMemberBinding才能使用CellTemplate ,因此需要对模板进行一些修改:

    <DataTemplate x:Key="MyDataTemplate">
        <Border BorderBrush="#FFA4D5E5" BorderThickness="1,1,0,0" Margin="6">
            <TextBox Text="{Binding TranslatedMessage}" 
                     TextWrapping="Wrap" 
                     BorderThickness="0" 
                     BorderBrush="#00000000" />
        </Border>
    </DataTemplate>

我并排放置了一个ListView和一个DataGrid ,以便您可以比较它们:

在此处输入图片说明

这是XAML:

<UniformGrid Columns="2">
    <ListView ItemsSource="{Binding}" HorizontalContentAlignment="Stretch">
        <ListView.View>
            <GridView AllowsColumnReorder="False">
                <GridViewColumn Header="Item" DisplayMemberBinding="{Binding Path=Item}"/>
                <GridViewColumn Header="Original Message" DisplayMemberBinding="{Binding OriginalMessage}"  Width="300"/>
                <GridViewColumn Header="Translated Message" CellTemplate="{StaticResource MyDataTemplate}" />
                <GridViewColumn Header="Sector"/>
            </GridView>
        </ListView.View>
    </ListView>

    <DataGrid ItemsSource="{Binding}"
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Item" Binding="{Binding Path=Item}" IsReadOnly="True"/>
            <DataGridTextColumn Header="Original Message" Binding="{Binding OriginalMessage}" IsReadOnly="True" Width="300"/>
            <DataGridTextColumn Header="Translated Message" Binding="{Binding TranslatedMessage}" />
            <DataGridTextColumn Header="Sector" Binding="{Binding Sector}"/>
        </DataGrid.Columns>
    </DataGrid>

</UniformGrid>
  • 请注意,ListView如何需要DataTemplates才能支持版本,并且默认情况下是只读的,而DataGrid默认情况下是可编辑的,不需要任何特殊的模板,并且要求您将IsReadOnly="True"到预期的列中为只读。

  • 另外,我注意到您正在使用过程代码将项目手动添加到ListView 这在WPF中是不希望的。 您必须使用ObservableCollection<>并操作该集合,然后让WPF绑定引擎为您更新UI。

  • 建议并希望您在WPF中将逻辑/数据与UI分开

  • 如果您需要进一步说明,请告诉我。

  • WPF摇滚。

将Gridview的第二列与OriginalMessage属性绑定。

喜欢 :-

DisplayMemberBinding =“ {Binding Path = OriginalMessage}”

它应该工作。

我认为您没有完全使用数据模板。 您只用它来显示一个属性; 实际上,您可以使用DataTemplate显示类(TranslatorListItem)中的所有数据; 这样的

     <DataTemplate x:Key="MyDataTemplate">
            <Border BorderBrush="#FFA4D5E5" BorderThickness="1,1,0,0" Margin="6">
                <TextBox Text="{Binding Item}" 
                         TextWrapping="Wrap" 
                         BorderThickness="0" 
                         BorderBrush="#00000000" />
                <TextBox Text="{Binding TranslatedMessage}" 
                             TextWrapping="Wrap" 
                             BorderThickness="0" 
                             BorderBrush="#00000000" />
                  ( ..... follow up)
                  </Border>
    </DataTemplate>
So your ListView  can design like this:
 <ListView ItemsSource="{Binding}" HorizontalContentAlignment="Stretch"
  ItemTemplate="{StaticResource MyDataTemplate}"> 
    </ListView>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM