始める前に、GISTで自分の問題に関連するファイルを追加しました:https ://gist.github.com/4468651
タイトルにあるように、私はWPFアプリを持っています(MVVMを実装するか、初心者になることができる限り最高です)。MainViewのVisibilityプロパティバインディングは、 ViewModelから関連する値を取得していないようです。
起動時に、インスタンス化でViewModelが見つからないことを示すバインディングエラーがスローされます(コンストラクターに渡されたとしても)。エラーは次のとおりです。
System.Windows.Data Error: 23 : Cannot convert '<null>' from type '<null>' to
type 'System.Windows.Visibility' for 'en-US' culture with default conversions;
consider using Converter property of Binding.
NotSupportedException:'System.NotSupportedException: EnumConverter cannot
convert from (null).
at System.ComponentModel.TypeConverter.GetConvertFromException(Object value)
at System.ComponentModel.EnumConverter.ConvertFrom(ITypeDescriptorContext context,
CultureInfo culture, Object value)
at MS.Internal.Data.DefaultValueConverter.ConvertHelper(Object o, Type destinationType,
DependencyObject targetElement, CultureInfo culture, Boolean isForward)'
TargetNullValueとNullConverterの両方をバインディングに追加しようとしましたが、警告や問題は軽減されませんでした。また、 System.Windows.Visibility値を提供するプロパティに直接変更して、ブールプロパティをチェックし、それに応じて可視性を設定するデータトリガーを使用しようとしましたが、これも問題や警告メッセージを変更しませんでした。
すべてがロードされた後、トレイアイコンのコンテキストメニューを表示し、[*ウィンドウを非表示]または[ウィンドウを表示] (MainViewに非表示または表示する必要があることを通知する必要があります)をクリックしても、何も起こりません。これが私です。 mコードで発生することを期待しています(問題に関連するファイルのみを参照しています):
App.xaml.csファイル-
namespace ordoFile
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
this.Properties["bgStartup"] = false;
if (e != null && e.Args.Count() > 0)
{
if(e.Args[0] == "-bg")
{
this.Properties["bgStartup"] = true;
}
}
Configs configs = new Configs();
PresetFilters presets = new PresetFilters();
OrganisationSyncer organisationSyncer = new OrganisationSyncer();
TrayApp trayApp = new TrayApp(organisationSyncer, configs);
Logger logger = new Logger();
BackgroundOrganiser backgroundOrganiser = new BackgroundOrganiser(new DirectoryModel());
ForegroundOrganiser foregroundOrganiser = new ForegroundOrganiser(new DirectoryModel());
DependencyFactory.Container.RegisterInstance<Configs>("configs", configs);
DependencyFactory.Container.RegisterInstance<PresetFilters>("presets", presets);
DependencyFactory.Container.RegisterInstance<OrganisationSyncer>("organisationSyncer", organisationSyncer);
DependencyFactory.Container.RegisterInstance<BackgroundOrganiser>("backgroundOrganiser", backgroundOrganiser);
DependencyFactory.Container.RegisterInstance<ForegroundOrganiser>("foregroundOrganiser", foregroundOrganiser);
DependencyFactory.Container.RegisterInstance<TrayApp>("trayApp", trayApp);
DependencyFactory.Container.RegisterInstance<Logger>("logger", logger);
MainViewModel mainViewModel = new MainViewModel(trayApp, organisationSyncer);
MainView mainView = new MainView(configs, trayApp, mainViewModel);
mainView.Show();
}
}
}
mainViewModel変数は、this.DataContext=mainViewModelを介してMainViewインスタンスのコンストラクターに設定されています。
MainView.xaml
<Window x:Class="ordoFile.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ordoFile.ViewModels"
xmlns:vw="clr-namespace:ordoFile.Views"
Title="ordoFile"
Name="MainWindow"
Height="500"
Width="815">
<Window.Style>
<Style TargetType="Window">
<Setter Property="Visibility" Value="{Binding WindowVisibility}" />
</Style>
</Window.Style>
<Grid Name="ContentGrid">
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<vw:ForegroundOrganiserView Grid.RowSpan="2"/>
<vw:BackgroundOrganiserView Grid.Row="2"/>
</Grid>
</Window>
MainViewModel.cs
namespace ordoFile.ViewModels
{
public class MainViewModel : ViewModelBase
{
TrayApp _trayApp;
OrganisationSyncer _organisationSyncer;
Visibility _windowVisibility;
public MainViewModel(TrayApp trayApp, OrganisationSyncer organisationSyncer)
{
_trayApp = trayApp;
_organisationSyncer = organisationSyncer;
OnInitialise();
}
/// <summary>
/// Return visibilty staus of MainView
/// </summary>
public Visibility WindowVisibility
{
get { return _windowVisibility; }
set
{
_windowVisibility = value;
OnPropertyChanged("WindowVisibility");
}
}
void OnInitialise()
{
WindowVisibility = _organisationSyncer.WindowVisibilty;
// Add method to event handler in OrganisationSyncer
// that will be called when UI visibility is to be updated.
_organisationSyncer.UpdateWindowVisibility += CheckVisibilityStatus;
}
/// <summary>
/// Set property to visibility value held in OrganisationSyncer
/// instance.
/// </summary>
void CheckVisibilityStatus(object sender, EventArgs e)
{
WindowVisibility = _organisationSyncer.WindowVisibilty;
}
}
}
これはすべて正常に機能しているように見え、セッターが呼び出され、UIもそれを読み取ろうとします(更新が発生した後にスローされたゲッターで例外をスローすることでこれをチェックしました)。
私は途方に暮れています、そしてどんな入力でもありがたいです!
ps https://www.dropbox.com/s/03z361qyws4jhuo/ordoFile.zipは、問題を特によく説明していないと確信しているため、実際のプロジェクトをいじくり回したい場合は、プロジェクトファイルへのリンクです。
Uodate(Backlashのおかげで):前述のエラーは、MainViewの可視性が正しく更新されないという私の問題に関連しているようには見えません。