私は、ユーザーにアセットのリストを表示し、リストからアセットを削除することを許可するビュー(「Familify」と呼ばれる)を作成しています。アセットはViewModel内のObservableCollection
に格納されているため、削除するコマンドは単にアセットオブジェクトを取り出してコレクションから削除します。私は問題を '削除'機能の作業を取得しています。アイデアは、ボタンをクリックすると、リストから資産を取り除くことであるx:データテンプレートとは異なるデータ型でバインドする
Familify.xaml
<ListView
ItemsSource="{Binding Assets}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80px" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="150px" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="60px" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Text="{Binding number}" FontFamily="Consolas"/>
<TextBlock
Grid.Column="1"
Text="{Binding type}"/>
<TextBlock
Grid.Column="2"
Text="add binding here"/>
<TextBlock
Grid.Column="3"
Text="add binding here"/>
<Button
Command="{x:Bind ViewModel.RemoveAssetCommand}"
CommandParameter="{Binding}"
Content=""
FontFamily="Segoe MDL2 Assets"
Grid.Column="4">
</Button>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Familify.xaml.cs
namespace asset_manager.Views
{
public sealed partial class Familify : UserControl
{
FamilifyViewModel ViewModel { get; set; }
public Familify()
{
this.InitializeComponent();
DataContextChanged += (s, e) =>
{
ViewModel = DataContext as FamilifyViewModel;
};
}
}
}
:ここではXAMLと分離コードであります。 (ただ、number
、type
などを示す正常な結合に注意することは正しく機能している。)私の考えでは、これまで:
- は
RemoveAssetCommand
は、ページのビューモデルに保存されているアクセスするためにbinding
を使用するようにしてください。しかし、私は仕事に先祖の結合を得ることができませんでした(findAncestor
がUWPにおけるものではありませんので、すなわちXAML階層内の要素上位までのデータコンテキストを見つけようとして動作しませんでした。) x:Bind
のように見えましたそれはプロパティへの明示的なパスを使用するためです。だから、もし私がViewModel
を私のコードの裏に宣言すれば、私はx:Bind ViewModel.property
を使うことができました。すべての井戸と良い。私はちょうどそれを行い、intellisenseは私がViewModel.RemoveAssetCommandにアクセスすることを許可しました。- しかし、私はエラー
no DataType defined for DataTemplate
を得るため、これはうまくいかなかった。これは意味があるので、私は2つのことを試みました。 x:DataType="Models:Asset"
(上記のDataTemplate
タグ)は、データテンプレートに表示されているモデルなので、最初に試しました。もちろん、コマンドはモデルで宣言されておらず、View Modelで宣言されているため、機能しませんでした。- 代わりに
x:DataType="ViewModels:FamilifyViewModel"
を試してみましたが、私はちょうどx:Bind
を使用することができます。しかし、タイプAsset
のオブジェクトをFamilifyViewModel
にキャストできないというエラーが発生しました。オブジェクトがこのデータテンプレートに渡されるのはAsset
なので、意味があります。
私がx:Bind
が働くと思った全体の理由は、コードビハインドのViewModelから直接プロパティにアクセスすることができたからです。
ViewModel
の基本レベルのプロパティ(この場合はPrismコマンド)にアクセスするには、データテンプレート内でx:Bind
を使用することは可能ですか? 2)この機能を実装するより良い方法はありますか?
これは完璧です、ありがとうございました! –