1

SIDJavnaUstanovaViewModel のプロパティ IsWriteAllowed を TextBox に設定しようとしています。私はそれを行うことができず、相対ソース、ElementName を試しましたが、うまくいきません。IsWriteAllowed プロパティを TextBox IsEnabled プロパティに設定しようとしています。私が StaticResource を持っている XAML-s では、これは正常に機能していますが、ここでは、プログラムで DataContext を設定すると、バインドできません。プログラムで DataContext を設定しました:

SIDJavnaUstanovaViewModel definitionvm = new SIDJavnaUstanovaViewModel();
definitionvm.FillElements(null);
Definition definition = new Definition();   // Create new XAML 
definition.DataContext = definitionvm;      // Set its DataContext
definition.Show();

XAML は次のようになります。

<src:BaseWindow x:Class="StoreIDCard.Definition"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{Binding RelativeSource={RelativeSource Self}}"   // i tried without that, but nothing happens 
xmlns:src="clr-namespace:StoreIDCard.Base"
xmlns:ComponentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns:viewmod="clr-namespace:StoreIDCard.ViewModel"
x:Name="DefinitionWin"
WindowStartupLocation="CenterScreen"
ResizeMode="CanMinimize" ShowInTaskbar="True"   
xmlns:my="clr-namespace:StoreIDCard.View" Width="521" Height="494" 
Icon="/StoreIDCard;component/Images/Delhaize.png" IsEnabled="{Binding}">
<Grid Height="465" Width="503" >
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="476*" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Button Content="{StaticResource save}" Command="{Binding SaveAndUpdate}" Height="34" HorizontalAlignment="Left" Margin="188,411,0,0" VerticalAlignment="Top" Width="133" />

    <DataGrid AutoGenerateColumns="False" Block.TextAlignment="Left"  Height="331"   Visibility="{Binding Path=IsVisible}"   ItemsSource="{Binding Path=Elements}" Name="dataGrid2" SelectedItem="{Binding  SelectedElement}" VerticalAlignment="Top" HorizontalAlignment="Left" Width="371" UseLayoutRounding="True" VerticalScrollBarVisibility="Auto" Margin="73,53,0,0">
            <DataGrid.Columns>
                <DataGridTemplateColumn   Header="{StaticResource name}" Width="320">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                        <TextBox Text="{Binding Naziv, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Background="{Binding BackgroundColor}"

  IsReadOnly="{Binding Path=IsReadonly}"
////CANNOT SET ISWRITEALLOWED HERE, TRIED EVERYTHING
 IsEnabled="{Binding Path=IsWriteAllowed, RelativeSource={RelativeSource Self}}"/>
                    </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
            <DataGrid.ContextMenu>
                <ContextMenu>
// ISWRITEALLOWED WORKING PERFECTLY Here
                    <MenuItem Command="{Binding  Delete}"   IsEnabled="{Binding Path=IsWriteAllowed}"  Header="{StaticResource delete}"/>
                    <MenuItem ClipToBounds="True" Command="{Binding Add}"  Header="{StaticResource add}"/>
                </ContextMenu>
4

2 に答える 2

1

あなたが提供した答えは正しいですが、別の選択肢を提供すると思いました。.NET 4 以降を使用している場合は、x:Referenceマークアップを使用できます。

ルート ウィンドウの名前が であることがわかります。DefinitionWinしたがって、次のように x:Reference を使用できます。

IsEnabled="{Binding DataContext.IsWriteAllowed, Source={x:Reference DefinitionWin}}"

これにより、WPF がビジュアル ツリーを移動する必要がなくなります。

于 2013-09-02T10:28:37.973 に答える
0

さて、解決策を見つけたようです...検索して、もう一度検索しました...

IsEnabled="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.IsWriteAllowed}"

https://stackoverflow.com/questions/1127933/wpf-databinding...

于 2013-09-02T09:27:32.590 に答える