[英]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分开 。
如果您需要进一步说明,请告诉我。
将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.