在XAML / WP8.1中的DataTemplate中绑定Flyout MenuItem的可见性

时间:2015-06-23 16:48:18

标签: xaml windows-phone-8.1 visibility

我想将Flyout MenuItem上的Visibility属性绑定到ViewModel上的布尔值。这是我的ViewModel及相关代码:

public class AppVM
{
    public ObservableCollection<RecordFileVm> Files { get; set; }
    public bool AlreadyUploaded = false;
}

namespace App.Common.XAML_Helpers
{
    public class BooleanToVisibilityConverter : IValueConverter
    {
        private static object GetVisibility(object value)
        {
            if (!(value is bool))
            {
                return Visibility.Collapsed;
            }

            var objValue = (bool)value;

            return objValue ? Visibility.Visible : Visibility.Collapsed;
        }
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            return GetVisibility(value);
        }
        public object ConvertBack(object value, Type targetType, object parameter, string language)
        {
            throw new NotImplementedException();
        }
    }
}

这是我的XAML代码:

<DataTemplate x:Key="TemplateRecordedFiles">
    <!-- other code here -->
    <FlyoutBase.AttachedFlyout>
        <MenuFlyout>
            <MenuFlyoutItem x:Name="RemoveItem"
                Text="Delete Item"
                Click="RemoveItem_OnClick"/>
            <MenuFlyoutItem x:Name="UploadItem"
                Text="Upload Item"
                Click="UploadItem_OnClick" Visibility="{Binding AlreadyUploaded, Converter = {StaticResource BoolToVis}}"/>
        </MenuFlyout>
    </FlyoutBase.AttachedFlyout>
</DataTemplate>

我不知道为什么,但这不起作用!在其他布尔值上,我的BooleanToVisibilityConverter工作正常!

2 个答案:

答案 0 :(得分:1)

首先,为了能够绑定它,AlreadyUploaded应该是属性而不是字段:

public bool AlreadyUploaded { get; set; }

此外,您应该按照BurakKaanKöse的建议实施INotifyPropertyChanged,并在PropertyChanged属性发生更改时引发AlreadyUploaded事件,以便将此更改报告给视图。< / p>

最后,似乎AlreadyUploaded是在View的全局ViewModel中定义的,而您尝试从DataTemplate内部绑定它(虽然您的代码片段对此不太清楚)?在这种情况下,您需要显式绑定到View的DataContext(它的ViewModel)。

例如,您可以通过为包含所有其他元素的页面根网格分配唯一名称来执行后者,例如:

<Grid x:Name="Root">

并明确绑定到此商品的DataContext,这与视图的全局DataContext相同:

Visibility="{Binding ElementName=Root, Path=DataContext.Show, Converter={StaticResource BoolToVis}}"

答案 1 :(得分:0)

从上面的XAML看,看起来你在DataTemplate中有你的Flyout。根据您声明此DataTemplate的位置以及设置控件的DataContext的位置,可能未设置MenuFlyout的DataContext。这可以解释您所看到的行为。也许作为调试步骤,您可以在MenuFlyout上订阅DataContextChanged事件,并查看该代码何时被命中。这将帮助您确保确实正在设置MenuFlyout的DataContext。希望这可以帮助! 安德鲁